Skip to content

Conversation

@morganchen12
Copy link

No description provided.

# [START pipeline_concepts]
pipeline = client.pipeline() \
.collection("cities") \
.where(Field.of("population").greater_than(100000)) \

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion: Python lets you break up large numbers, so you could do 100_000 for readability (and consider this for other large numbers in this file)

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done here and throughout


default_app = firebase_admin.initialize_app()
client = firestore.client(default_app, "your-new-enterprise-database")

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We also have an async version of everything.

Often, we re-write the samples for both sync and async, and show both options in the language selection pickers. I'm not sure how you want to handle that here.

Maybe a couple samples for pipeline_initialization_async and basic_read_async is enough to show it exists, since the API is almost identical. Or maybe samples for async aren't needed for preview

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I will try to get to the async versions after Java and if I don't get to it by launch day it'll just be a follow-on.

.execute()
# [END vector_length]
for res in result:
print(res)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would be great if we could have a test file that exercises these functions. Even just running them without verifying outputs would be helpful to make sure no exceptions are thrown, but reading back results would be ideal

It looks like the other samples in this repo aren't tested though, so maybe that would be too much to set up

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will defer to another PR

Field.of("rating").average().as_("avg_rating"),
groups=[Field.of("genre")]
) \
.execute()

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If you want to get rid of all the \, IIRC think you could do something like this:

results = (
    client.pipeline()
    .collection("books")
    .aggregate(
        Field.of("rating").average().as_("avg_rating"),
        groups=[Field.of("genre")]
    ).execute()
)

(But test it first)

Copy link

@daniel-sanche daniel-sanche left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider adding more imports for Vector, and others that may be missing through the file

But overall LGTM

@morganchen12
Copy link
Author

After adding the snippets for expressions and inputs, I'm getting these errors:

(.venv) morganchen-mac:firebase-admin-python morganchen$ ./lint.sh 
Running linter on snippets/firestore/firestore_pipelines.py
************* Module snippets.firestore.firestore_pipelines
snippets/firestore/firestore_pipelines.py:1770:20: E1101: Module 'firebase_admin.firestore' has no 'SERVER_TIMESTAMP' member (no-member)
snippets/firestore/firestore_pipelines.py:2009:41: E1101: Class 'Expression' has no 'array' member (no-member)
snippets/firestore/firestore_pipelines.py:2010:16: E1101: Class 'Expression' has no 'array' member (no-member)
snippets/firestore/firestore_pipelines.py:2288:12: E1101: Instance of 'Field' has no 'array_get' member (no-member)

For the errors:

  1. I'm not sure why I'm getting this error, it seems to be invoked correctly based on our docs
  2. I'm also not sure why I'm getting this error since Array is documented here
  3. See 2
  4. The array_get method seems to just be missing from the Python SDK. @daniel-sanche this is likely me not reading something somewhere, but just in case it was overlooked

@daniel-sanche
Copy link

  1. One of those is from google.cloud import firestore, and the other is from firebase_admin import firestore. I'm not super familiar with the firebase_admin wrapper, but I don't think those are fully equivalent

  2. In the end, I think Array was actually implemented as a stand-alone class:

from google.cloud.firestore_v1.pipeline_expressions import Array
Array(["bar", Field.of("baz")])

It looks like there's an out-dated docstring. I can fix that.

Let me know if you think it's important to have array exposed on Expression as well though. I removed it in an effort to keep the API surface manageable, instead of exposing multiple ways of expressing the same thing. But I can add it back if that's more consistent with other languages.

  1. array_get was a late addition, but it should be in the preview branch as of yesterday. Maybe try running again

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants