3

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 の微妙な動作の違いですか?

4

1 に答える 1

3

これは、複合クエリのルート エンティティだけでなく、提供された先祖のフル パスを使用した AppScale のバグです。それに対する修正はここにあります: https://github.com/AppScale/appscale/pull/1633

于 2014-11-04T05:25:46.283 に答える