Скажут, у меня есть простая установка 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, или я сделал что-то неправильно?
Насколько я знаю, это должно быть возможно, но я могу понять, почему требуется составной индекс. Поскольку вы фильтруете только подкласс (хранящийся в свойстве '^ i'), для запроса требуется составной индекс для информации о классе ('^i') и 'mVal'. Я предполагаю, что документы Objectify ссылаются на индексы одного свойства, но я буду откладывать на _stickfigure_ на этом! – tx802
Спасибо, это было моей заботой. Документы немного расплывчаты относительно такого типа составного индекса. Я попробую ввести композит в 'datastore-indexes.xml' и посмотреть, изменит ли он поведение. –
@LarrySchiefer вам не нужно обязательно добавлять его самостоятельно. Хорошая идея, чтобы убедиться, что все индексы вам нужны, чтобы запускать все ваши запросы на вашем devserver. Это заполнит сам «datastore-indexes.xml» (см. Мой полный ответ здесь: http://stackoverflow.com/questions/28424157/how-to-build-datastore-indexes-php-gae/28480515#28480515 – Patrice