Skip to content

[firestore-emulator] Queries don't work in "datastore-mode" #6827

@artoale

Description

@artoale

[REQUIRED] Environment info

firebase-tools: Using the gcloud cli version 465.0.0, firestore emulator: 1.19.1

Platform: macOS (intel)

[REQUIRED] Test case

import os

from google.cloud import datastore
from google.cloud.datastore.query import PropertyFilter

def main():
    def get_new_client():
        return datastore.Client(
            project=os.environ.get("GCLOUDC_PROJECT_ID", "test"),
            namespace=None,
            _http=None,
        )

    client = get_new_client()
    kind = "a_kind"
    query = client.query(kind=kind)
    res = query.add_filter(filter=PropertyFilter("username", "=", "a_username")).fetch()

    if len(list(res)) > 0:
        print("found!")
    else:
        print("not found!")

if __name__ == "__main__":
    main()

[REQUIRED] Steps to reproduce

  1. Start the emulator with gcloud emulators firestore start --host-port=127.0.0.1:10901 --database-mode=datastore-mode
  2. Install the python deps: pip install google-cloud-datastore==2.19.0
  3. Set the DATASTORE_EMULATOR_HOST and DATASTORE_PROJECT_ID env vars accordingly
  4. Run the above python script

[REQUIRED] Expected behavior

Either "found!" or "not found!" is printed to console.

[REQUIRED] Actual behavior

An exception is raised:

Traceback (most recent call last):
  File "XXX/dev/experiments/firestore-emulator/./test_firestore_in_datastore.py", line 153, in <module>
    main()
  File "XXX/dev/experiments/firestore-emulator/./test_firestore_in_datastore.py", line 146, in main
    run_some_code()
  File "XXX/dev/experiments/firestore-emulator/./test_firestore_in_datastore.py", line 106, in run_some_code
    if len(list(res)) > 0:
           ^^^^^^^^^
  File "XXX/.pyenv/versions/firestore-emulator/lib/python3.11/site-packages/google/api_core/page_iterator.py", line 208, in _items_iter
    for page in self._page_iter(increment=False):
  File "XXX/.pyenv/versions/firestore-emulator/lib/python3.11/site-packages/google/api_core/page_iterator.py", line 244, in _page_iter
    page = self._next_page()
           ^^^^^^^^^^^^^^^^^
  File "XXX/.pyenv/versions/firestore-emulator/lib/python3.11/site-packages/google/cloud/datastore/query.py", line 845, in _next_page
    entity_pbs = self._process_query_results(response_pb)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "XXX/.pyenv/versions/firestore-emulator/lib/python3.11/site-packages/google/cloud/datastore/query.py", line 766, in _process_query_results
    raise ValueError("Unexpected value returned for `more_results`.")
ValueError: Unexpected value returned for `more_results`

Additional infos

For debugging purposes, I've inspected the returned response_pb and more_results is set to 0, equivalent to MORE_RESULTS_TYPE_UNSPECIFIED which, according to the spec, should never be provided.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions