Google App Engine и индексы

В случае, если при запросе у вас используется несколько условий, то GAE требует наличия индексов, другими словами, вот такой вот запрос отработает без индексов:

1
SELECT * FROM HyperLink WHERE param1 == 1

А вот такой потребует создания индекса:

1
SELECT * FROM HyperLink WHERE param1 == 1 && param2 == 2

Если вы программируете на Java, то, при локальной разработке, как только сервер выполнит запрос и обнаружит в нём два условия, то сгенерирует xml файл datastore-indexes-auto.xml примерно такого содержания:

1
2
3
4
5
6
7
8
9
10
<!-- Indices written at Sat, 8 Jan 2011 11:58:41 UTC -->

<datastore-indexes>

    <!-- Used 2 times in query history -->
    <datastore-index source="auto" ancestor="true" kind="HyperLink">
        <property direction="asc" name="param2"></property>
    </datastore-index>

</datastore-indexes>

Локально всё будет работать, но после deployment — com.google.appengine.api.datastore.DatastoreNeedIndexException. WTF!?

Оказывается, надо дописать в этот файл параметр autoGenerate=»true». Вот так:

1
2
3
4
5
6
7
8
9
10
<!-- Indices written at Sat, 8 Jan 2011 11:58:41 UTC -->

<datastore-indexes autogenerate="true">

    <!-- Used 2 times in query history -->
    <datastore-index source="auto" ancestor="true" kind="HyperLink">
        <property direction="asc" name="param2"></property>
    </datastore-index>

</datastore-indexes>

Попробуйте обратить на это внимание при первом прочтении документации. Даже при втором.