2012-03-29 28 views
0

我有一個持有givenName和familyName屬性的數據存儲中的聯繫人列表。 我可以搜索'givenName'以給定查詢參數開頭的聯繫人列表。我不喜歡這樣與Objectify4:通過多個屬性上的不等式查詢尋呼

Query<Contact> query = txn().consistency(Consistency.STRONG).load().type(Contact.class).ancestor(ancestor); 
    if (criteria.getSearchString() != null) { 
     query = query.filter(SEARCH_GIVEN_NAME + " >= ", criteria.getSearchString().toUpperCase()); 
     query = query.filter(SEARCH_GIVEN_NAME + " <= ", criteria.getSearchString().toUpperCase() + SENTINEL); 

    } 
    query = query.limit(criteria.getPageSize()).offset(criteria.getStartIndex()); 

但良好的用戶體驗,需要對「給定名稱」或「familyName」接觸開始,在搜索框中輸入的文本同時搜索。

我不能在一個數據存儲查詢(我認爲)中組合這個搜索。所以我將不得不執行兩個具有偏移和限制的查詢。

我唯一的到目前爲止的想法:

  • 假設的結果150-200搜索項= 'AB%' 的要求。

  • 以限制200開始以'ab'開頭的givenName的查詢;

  • 查詢以'ab'開頭的familyName,限制爲200;

  • 結合在一個排序結果列表

  • 兩個結果中的偏移量的綜合結果發現150-200。

爲同一搜索項的後續請求,但偏移200-250需要重複上都查詢整個搜索但限250。

這種感覺非常低效的(且昂貴)

回答

3

更簡單的解決方案是將兩者給出的姓和名到一個列表的財產,並執行對您的不平等比較。這將返回列表屬性中的任何項目滿足您的條件的任何條目。

+0

好的,我必須嘗試這個......所以我創建一個列表屬性列表名稱,我填充givenName和familyName的大寫值,每次我存儲/更新聯繫人。如果我想在列表的任何值中搜索「startsWith」,查詢將會是什麼樣子?謝謝 !! – koma 2012-03-29 13:17:28

+0

@koma正確。該查詢看起來與給定名稱上的現有範圍查詢相同。 – 2012-03-29 14:03:27

+0

就像一個魅力:-) – koma 2012-03-29 14:48:22