Google App Engine から AppScale にアプリを移植していますが、エンティティ グループに対して祖先クエリを実行するときに奇妙な動作を発見しました。
親がルートではない祖先クエリを実行すると、クエリはゼロの結果を返します。親をルートとして同じクエリを実行すると、正しい結果が返されます。
例で説明するのが最も簡単です:
class A(ndb.Model):
name = ndb.StringProperty()
class B(ndb.Model):
name = ndb.StringProperty()
class C(ndb.Model):
name = ndb.StringProperty()
active = ndb.BooleanProperty()
sort = ndb.IntegerProperty()
def main():
a = A(name='I am A')
a.put()
b = B(parent=a.key,
name='I am B')
b.put()
C(parent=b.key,
name='I am C1',
active=True,
sort=0).put()
C(parent=b.key,
name='I am C2',
active=True,
sort=1).put()
C(parent=b.key,
name='I am C3',
active=True,
sort=2).put()
query1 = C.query(C.active == True, ancestor=a.key).order(C.sort).fetch(10)
query2 = C.query(C.active == True, ancestor=b.key).order(C.sort).fetch(10)
print 'query 1 = %s' % len(query1)
print 'query 2 = %s' % len(query2)
上記のコードを App Engine で実行すると、両方のクエリで 3 つの結果が得られます。AppScale で実行すると、最初のクエリでは 3 つの結果しか得られず、2 番目のクエリでは 0 の結果しか得られません。
AppScale は Cassandra をデータストアとして使用します。これは、App Engine データストアと Cassandra の微妙な動作の違いですか?