2014-10-20 163 views
0

我想在AppEngine上使用投影查詢和Zigzag合併。看來,這需要投影屬性包含在鋸齒形合併查詢所使用的每個索引中。在我的用例中,這會導致實體更新成本太高。Zigzag合併投影查詢

爲了說明,下面是使用Java低級別數據存儲區API以及使用該索引指數(E,P1,P3)和索引(E,P2,P3)一個簡單的例子;這可以工作,但重複實體E在這兩個索引中的p3屬性。

// Create a sample entity with three (indexed) properties. 
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService(); 
Entity e = new Entity("E"); 
e.setProperty("p1", 1); 
e.setProperty("p2", 1); 
e.setProperty("p3", 1); 
datastore.put(e); 

// Query for the above entity with a projection on property p3. 
Query q = new Query("E"); 
Filter filter1 = new FilterPredicate("p1", FilterOperator.EQUAL, 1); 
Filter filter2 = new FilterPredicate("p2", FilterOperator.EQUAL, 1); 
q.setFilter(CompositeFilterOperator.and(filter1, filter2)); 
q.addProjection(new PropertyProjection("p3", Integer.class)); 
PreparedQuery pq = datastore.prepare(q); 
pq.asList(FetchOptions.Builder.withDefaults()); 

我想刪除的複合指標之一,說指數(E,P2,P3),只是依靠房地產P2默認的指數,從而降低成本更新。但是這樣做會在運行時導致DatastoreNeedIndexException。

請注意,如果我保留上述兩個索引,但僅向其中的一個添加第四個屬性,並在投影中包含此第四個屬性,則會出現類似問題。因此,使用默認索引似乎不成問題。

所以我的問題:是否有任何方式做鋸齒形合併投影查詢沒有重複索引所有投影屬性?如果不是,我想了解潛在的技術原因。

任何指針非常讚賞。

回答

1

好的,現在我明白爲什麼投影屬性需要在所有涉及的索引中重複:因爲索引排序順序在所有相關索引塊(本例中爲兩個)中必須相同才能工作。

在此示例中,最後的排序順序是在投影屬性上完成的。當這個索引被刪除時,它會改變排序順序,並且需要一種新的索引才能起作用。

所以,我不認爲我現在可以在AppEngine上做什麼。需要新的專用AppEngine功能才能啓用不影響索引排序順序的索引屬性。