2015-03-05 2 views
2

Скажут, у меня есть простая установка Entity иерархии, где базовые (абстрактный) класс имеет общие поля:App Engine объективировать не создает индекс базового класса поле

@Entity 
public abstract class Base { 
    @Id 
    Long mId; 

    @Index 
    Long mVal; 
} 

Теперь у меня есть подкласс (как в Java и в объективизации):

@Subclass(index=true) 
public class Concrete extends Base { 
    @Index mOtherVal; 
} 

Когда Concrete сохранен, он правильно создает записи в хранилище данных для всех полей (mId, mVal и mOtherVal). Однако, если я пытаюсь выполнить запрос против Concrete записей с фильтром mVal, приложение двигатель жалуется, что нет индекса:

List<Concrete> result = 
    OfyService.ofy().load().type(Concrete.class).filter("mVal > ", 10).list(); 

Я вижу журнал исключений, как это:

com.google.api.server.spi.SystemService invokeServiceMethod: cause={0} com.google.appengine.api.datastore.DatastoreNeedIndexException: no matching index found. The suggested index for this query is: <datastore-index kind="Post" ancestor="false" source="manual"> <property name="^i" direction="asc"/> <property name="mVal" direction="asc"/> </datastore-index>

Я не создал datastore-indexes.xml намеренно, так как документы Objectify указывают, что индексы на полях создаются «на лету». Итак, мой вопрос: это известное ограничение Objectify, или я сделал что-то неправильно?

+0

Насколько я знаю, это должно быть возможно, но я могу понять, почему требуется составной индекс. Поскольку вы фильтруете только подкласс (хранящийся в свойстве '^ i'), для запроса требуется составной индекс для информации о классе ('^i') и 'mVal'. Я предполагаю, что документы Objectify ссылаются на индексы одного свойства, но я буду откладывать на _stickfigure_ на этом! – tx802

+0

Спасибо, это было моей заботой. Документы немного расплывчаты относительно такого типа составного индекса. Я попробую ввести композит в 'datastore-indexes.xml' и посмотреть, изменит ли он поведение. –

+1

@LarrySchiefer вам не нужно обязательно добавлять его самостоятельно. Хорошая идея, чтобы убедиться, что все индексы вам нужны, чтобы запускать все ваши запросы на вашем devserver. Это заполнит сам «datastore-indexes.xml» (см. Мой полный ответ здесь: http://stackoverflow.com/questions/28424157/how-to-build-datastore-indexes-php-gae/28480515#28480515 – Patrice

ответ

1

Как вы, вероятно, выяснили из комментариев по вопросу, вам нужен индекс мультипроцессорности в datastore-indexes.xml.

Надеюсь, что это совершенно очевидно, почему это необходимо - вы запрашиваете запрос, в котором mVal ограничено неравенством, а индекс дискриминатора (реализуемый Objectify как свойство ^i) содержит определенное значение. Если вы хотите быть немного более умным, вы можете запросить ofy().load().type(Base.class).filter("mVal > ", 10), и вам не понадобится дополнительный индекс, потому что достаточно простого индекса с одним свойством.

Индексы мультипроцессорности (поддерживаемые GAE в datastore-indexes.xml) сильно отличаются от индексов одного свойства, поддерживаемых Objectify. Это подробно объясняется в документах GAE.

+0

Да, с помощью каждого, документами и экспериментами, я смог прийти к такому же выводу. У меня было подозрение, что это будет так, но не было положительным, поскольку документы были немного расплывчатыми.Это имеет смысл с тем, как Objectify обрабатывает наследование, я просто надеялся, что там какая-то магия там пропала. Спасибо за ответ! –

Смежные вопросы