2014-10-20 72 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功能才能启用不影响索引排序顺序的索引属性。