1

複合インデックス (prop0 asc、prop1 asc) があります。prop0 と prop1 がインデックスされていなくても更新されるかどうかを確認するために、テストを行いました。以下の AppStats スクリーンショットに示すように、テストにはいくつかのリクエストがあります。

リクエスト 1: 複合フィルター クエリ (リクエスト 4 と同じ)。

リクエスト 2: リクエスト 5 と同じ DataStore を作成しますが、すべてのプロパティのインデックスを作成しません。

リクエスト 3: データストアのクリーンアップ。

リクエスト 4: 複合フィルター クエリ。

リクエスト 5: すべてのプロパティがインデックス化されたデータストアの作成。

リクエスト 6: memcache のクリーンアップ。

ここに画像の説明を入力

リクエスト 1 は結果を返しません。これは、リクエスト 2 で複合インデックスが更新されていない場合に予想されることです。私の質問は、そうですか?

関連するコードは以下です。

// DataStore creation.
public ReturnCodes operate() {
    DatastoreService dataStore = DatastoreServiceFactory.getDatastoreService();

    Entity testEntity = new Entity(ENTITY_NAME, ROOT_NAME);
    Key rootKey = KeyFactory.createKey(DataStoreCreation.ENTITY_NAME, ROOT_NAME);
    setProps(testEntity, 0);
    dataStore.put(testEntity);

    for(int i = 1; i < numEntities; ++i) {
        // Chave = nome da entidade + i
        testEntity = new Entity(ENTITY_NAME, ENTITY_NAME + i, rootKey);
        setProps(testEntity, i);
        dataStore.put(testEntity);
    }

    return ReturnCodes.SUCCESS;
}

private void setProps(Entity entity, int value) {
    for(int j = 0; j < numProps; ++j) {
        if(indexed) {
            entity.setProperty(PROPERTY_NAME_PREFIX + j, value);
        }
        else {
            entity.setUnindexedProperty(PROPERTY_NAME_PREFIX + j, value);
        }
    }
}

// DataStore cleanup.
private ReturnCodes clean() {
    Key rootKey = KeyFactory.createKey(DataStoreCreation.ENTITY_NAME, DataStoreCreation.ROOT_NAME);
    DatastoreService dataStore = DatastoreServiceFactory.getDatastoreService();

    Query query = new Query(DataStoreCreation.ENTITY_NAME).setKeysOnly();
    PreparedQuery prepQuery = dataStore.prepare(query);
    Iterable<Entity> entities = prepQuery.asIterable();
    ArrayList<Key> keys = new ArrayList<Key>();

    for(Entity entity : entities) {
        keys.add(entity.getKey());
    }
    dataStore.delete(keys);

    return ReturnCodes.SUCCESS;
}

// Composite filter query.
public ReturnCodes doQuery() {
    DatastoreService dataStore = DatastoreServiceFactory.getDatastoreService();

    for(int i = 0; i < numIters; ++i) {
        Query.FilterPredicate filter0 = new Query.FilterPredicate(DataStoreCreation.PROPERTY_NAME_PREFIX + 0,
                Query.FilterOperator.NOT_EQUAL, 0);
        Query.FilterPredicate filter1 = new Query.FilterPredicate(DataStoreCreation.PROPERTY_NAME_PREFIX + 0,
                Query.FilterOperator.GREATER_THAN_OR_EQUAL, 0);
        CompositeFilter finalFilter = Query.CompositeFilterOperator.or(filter0, filter1);
        Query query = new Query(DataStoreCreation.ENTITY_NAME/*, key*/).setFilter(finalFilter);
        query.addProjection(new PropertyProjection(DataStoreCreation.PROPERTY_NAME_PREFIX + 0, Integer.class));
        query.addProjection(new PropertyProjection(DataStoreCreation.PROPERTY_NAME_PREFIX + 1, Integer.class));
        PreparedQuery prepQuery = dataStore.prepare(query);
        Iterable<Entity> results = prepQuery.asIterable();

        if(!results.iterator().hasNext()) {
            return ReturnCodes.ERROR;
        }

        for(Entity result : results) {
            //log.info(result.toString());
        }
    }

    return ReturnCodes.SUCCESS;
}
4

1 に答える 1

1

おっしゃる通りです。複合インデックスputに、エンティティでインデックスを作成しないように明示的に設定したプロパティが含まれている場合、複合インデックスは作成されません。

この機能のサポートについては、こちらのディスカッションを参照してください。また、回避策に役立つヒントもいくつか含まれています。

于 2013-09-27T17:19:14.627 に答える