Skip to content

Property with empty list 4 - #512

Merged
dhermes merged 1 commit into
googleapis:masterfrom
lucemia:property-with-empty-list-4
Jan 13, 2015
Merged

Property with empty list 4#512
dhermes merged 1 commit into
googleapis:masterfrom
lucemia:property-with-empty-list-4

Conversation

@lucemia

Copy link
Copy Markdown
Contributor

for issue #403

Previous PR
#404

@dhermesdhermes mentioned this pull request Jan 8, 2015
Comment threadgcloud/datastore/connection.py Outdated

This comment was marked as spam.

@dhermes

Copy link
Copy Markdown
Contributor
  1. I like this change.
  2. What is the difficulty in getting this to work for PropertyFilter?
  3. Please run tox locally before submitting changes.
  4. I want to let @tseaver have a chance to see this before signing off.

@tseaver

Copy link
Copy Markdown
Contributor

_set_protobuf_property looks like a win: I think we have a least a couple of versions of it lying around in the code. Once @dhermes' issues are addressed, LGTM.

@lucemia

Copy link
Copy Markdown
ContributorAuthor

@dhermes
for Property with None value, my testing shows that the current behavior is the same as ndb. (both save a property will null value)
In that case we don't need to handle the None value.
I will updated the docstring for save_entity

ndb

from google.appengine.ext import ndb
class Kind(ndb.Model):
foo = ndb.StringProperty()
bar = ndb.StringProperty()
bar1 = ndb.StringProperty(repeated=True)
a = Kind(bar=None, bar1=[])
a.put()

gcloud-python

from gcloud import datastore
from gcloud.credentials import *
from gcloud.datastore.key import *
client_email = "foo@mail.com"
private_key_path = "path/to/key.p12"
SCOPE = ('https://www.googleapis.com/auth/datastore ',
'https://www.googleapis.com/auth/userinfo.email')
credentials = get_for_service_account_p12(client_email, private_key_path, SCOPE)
key_pb = Key('Kind', 1234, dataset_id="tagtooadex2").to_protobuf()
conn = datastore.connection.Connection(credentials)
result = conn.save_entity("tagtooadex2", key_pb, {
'foo': u'Foo',
'bar': None,
'bar1': []
})

@dhermes

Copy link
Copy Markdown
Contributor

@lucemia I was curious to see what actually is stored, which requires inspecting the retrieved protobuf.

After storing

>>>fromgcloudimportdatastore>>>fromgcloud.datastore.entityimportEntity>>>fromgcloud.datastore.keyimportKey>>>>>>datastore.set_default_connection()
>>>dataset_id='datasetfoo'>>>datastore.set_default_dataset_id(dataset_id)
>>>>>>key=Key('Kind', 1234)
>>>entity=Entity(key=key)
>>>entity['foo'] =None>>>dict(entity)
{'foo': None}
>>>entity.save()

retrieving the same entity shows that the property is set but Property.value is empty:

>>>entity_pb, =datastore.get_connection().lookup(
... dataset_id=dataset_id,
... key_pbs=[key.to_protobuf()],
... )
>>>prop_foo, =entity_pb.property>>>prop_foo.nameu'foo'>>>prop_foo_value=prop_foo.value>>>prop_foo_value._fields
{}

This happens because in helpers._set_protobuf_value, Property.value is cleared but the property is still set on the Entity.

It's unclear what is the right thing to support, maybe going with ndb is fine? However, the note you introduce makes it seem the property will be dropped all together (as is done for []).


Cleanup:

>>>printentity_pbkey {
partition_id {
dataset_id: "s~datasetfoo"
}
path_element {
kind: "Kind"id: 1234
}
}
property {
name: "foo"value {
}
}
>>>entity.key.delete()

@coveralls

Copy link
Copy Markdown

Coverage Status

Coverage remained the same when pulling 479ea6a on lucemia:property-with-empty-list-4 into 6bde37d on GoogleCloudPlatform:master.

@dhermesdhermes added the api: datastore Issues related to the Datastore API. label Jan 9, 2015
@lucemia

Copy link
Copy Markdown
ContributorAuthor

@dhermes

It's unclear what is the right thing to support, maybe going with ndb is fine? However, the note you introduce makes it seem the property will be dropped all together (as is done for []).

Currently I go with ndb way. I updated the note to only include empty list case.

What is the difficulty in getting this to work for PropertyFilter?

Store a Property whose value is empty list sounds normal and should not raise any exception (currently I am working with).
But create a PropertyFilter whose value is empty list sounds weird.
Which behavior (write a helper function or raise exception) is recommend for PropertyFilter case is unclear for me.

ps. Rebase is welcome

In ndb, pass an empty list will cause a special FalseNode state.

s~tagtooadex2>Kind.query(Kind.bar.IN([]))
Query(kind='Kind', filters=<google.appengine.ext.ndb.query.FalseNodeobjectat0x104ab5210>)
s~tagtooadex2>Kind.query(Kind.bar.IN(['a']))
Query(kind='Kind', filters=FilterNode('bar', '=', 'a'))

and raise exception while query.

s~tagtooadex2>Kind.query(Kind.bar.IN([])).fetch()
WARNING:root:initialgenerator_run_to_list(query.py:956) raisedBadQueryError(CannotconvertFalseNodetopredicate)
Traceback (mostrecentcalllast):
File"<console>", line1, in<module>File"/Users/david/google-cloud-sdk/platform/google_appengine/google/appengine/ext/ndb/utils.py", line142, inpositional_wrapperreturnwrapped(*args, **kwds)
File"/Users/david/google-cloud-sdk/platform/google_appengine/google/appengine/ext/ndb/query.py", line1187, infetchreturnself.fetch_async(limit, **q_options).get_result()
File"/Users/david/google-cloud-sdk/platform/google_appengine/google/appengine/ext/ndb/tasklets.py", line325, inget_resultself.check_success()
File"/Users/david/google-cloud-sdk/platform/google_appengine/google/appengine/ext/ndb/tasklets.py", line371, in_help_tasklet_alongvalue=gen.send(val)
File"/Users/david/google-cloud-sdk/platform/google_appengine/google/appengine/ext/ndb/query.py", line961, in_run_to_listdsquery=self._get_query(conn)
File"/Users/david/google-cloud-sdk/platform/google_appengine/google/appengine/ext/ndb/query.py", line908, in_get_queryfilters=filters._to_filter()
File"/Users/david/google-cloud-sdk/platform/google_appengine/google/appengine/ext/ndb/query.py", line425, in_to_filter'Cannot convert FalseNode to predicate')
BadQueryError: CannotconvertFalseNodetopredicate

@dhermes

Copy link
Copy Markdown
Contributor

I see, I was thinking the issue was the code, but you're saying the expected behavior is a bit subtle.

Also, what do you mean by "Rebase is welcome"?

@lucemia

Copy link
Copy Markdown
ContributorAuthor

@dhermes

Also, what do you mean by "Rebase is welcome"?

Last pull request you ask about re-writeing history. I mean feel free to do so if necessary :)

@lucemia
lucemiaforce-pushed the property-with-empty-list-4 branch from 479ea6a to a250cb2CompareJanuary 12, 2015 02:46
@coveralls

Copy link
Copy Markdown

Coverage Status

Coverage remained the same when pulling a250cb2 on lucemia:property-with-empty-list-4 into 0525530 on GoogleCloudPlatform:master.

@lucemia

Copy link
Copy Markdown
ContributorAuthor

I have squash the commit

dhermes added a commit that referenced this pull request Jan 13, 2015
@dhermes
dhermes merged commit 8a42ef5 into googleapis:masterJan 13, 2015
atulep pushed a commit that referenced this pull request Apr 3, 2023
* docs: Fix formatting of request arg in docstring
chore: Update gapic-generator-python to v1.9.1
PiperOrigin-RevId: 518604533
Source-Link: googleapis/googleapis@8a085ae
Source-Link: googleapis/googleapis-gen@b2ab4b0
Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiYjJhYjRiMGEwYWUyOTA3ZTgxMmMyMDkxOThhNzRlMDg5OGFmY2IwNCJ9
* 🦉 Updates from OwlBot post-processor
See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md
---------
Co-authored-by: Owl Bot <gcf-owl-bot[bot]@users.noreply.github.com>
atulep pushed a commit that referenced this pull request Apr 6, 2023
* docs: Fix formatting of request arg in docstring
chore: Update gapic-generator-python to v1.9.1
PiperOrigin-RevId: 518604533
Source-Link: googleapis/googleapis@8a085ae
Source-Link: googleapis/googleapis-gen@b2ab4b0
Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiYjJhYjRiMGEwYWUyOTA3ZTgxMmMyMDkxOThhNzRlMDg5OGFmY2IwNCJ9
* 🦉 Updates from OwlBot post-processor
See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md
---------
Co-authored-by: Owl Bot <gcf-owl-bot[bot]@users.noreply.github.com>
atulep pushed a commit that referenced this pull request Apr 6, 2023
* docs: Fix formatting of request arg in docstring
chore: Update gapic-generator-python to v1.9.1
PiperOrigin-RevId: 518604533
Source-Link: googleapis/googleapis@8a085ae
Source-Link: googleapis/googleapis-gen@b2ab4b0
Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiYjJhYjRiMGEwYWUyOTA3ZTgxMmMyMDkxOThhNzRlMDg5OGFmY2IwNCJ9
* 🦉 Updates from OwlBot post-processor
See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md
---------
Co-authored-by: Owl Bot <gcf-owl-bot[bot]@users.noreply.github.com>
atulep pushed a commit that referenced this pull request Apr 18, 2023
* docs: Fix formatting of request arg in docstring
chore: Update gapic-generator-python to v1.9.1
PiperOrigin-RevId: 518604533
Source-Link: googleapis/googleapis@8a085ae
Source-Link: googleapis/googleapis-gen@b2ab4b0
Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiYjJhYjRiMGEwYWUyOTA3ZTgxMmMyMDkxOThhNzRlMDg5OGFmY2IwNCJ9
* 🦉 Updates from OwlBot post-processor
See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md
---------
Co-authored-by: Owl Bot <gcf-owl-bot[bot]@users.noreply.github.com>
parthea pushed a commit that referenced this pull request Aug 15, 2023
Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>
vchudnov-g pushed a commit that referenced this pull request Sep 20, 2023
Source-Link: googleapis/synthtool@f15cc72
Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:bc5eed3804aec2f05fad42aacf973821d9500c174015341f721a984a0825b6fd
parthea pushed a commit that referenced this pull request Sep 22, 2023
* feat: add SPOT to Preemptibility enum
PiperOrigin-RevId: 503019826
Source-Link: googleapis/googleapis@77cd8f1
Source-Link: googleapis/googleapis-gen@a3b02db
Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiYTNiMDJkYmIzMzljZjhkYWU1ZDYxMTQ1MDI5MmI3ODIwZjEyMDA3NSJ9
* 🦉 Updates from OwlBot post-processor
See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md
* docs: Add documentation for enums
fix: Add context manager return types
chore: Update gapic-generator-python to v1.8.1
PiperOrigin-RevId: 503210727
Source-Link: googleapis/googleapis@a391fd1
Source-Link: googleapis/googleapis-gen@0080f83
Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiMDA4MGY4MzBkZWMzN2MzMzg0MTU3MDgyYmNlMjc5ZTM3MDc5ZWE1OCJ9
* 🦉 Updates from OwlBot post-processor
See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md
Co-authored-by: Owl Bot <gcf-owl-bot[bot]@users.noreply.github.com>
parthea pushed a commit that referenced this pull request Oct 21, 2023
parthea pushed a commit that referenced this pull request Oct 21, 2023
Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>
parthea pushed a commit that referenced this pull request Oct 21, 2023
Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>
parthea pushed a commit that referenced this pull request Oct 22, 2023
* docs: Fix formatting of request arg in docstring
chore: Update gapic-generator-python to v1.9.1
PiperOrigin-RevId: 518604533
Source-Link: googleapis/googleapis@8a085ae
Source-Link: googleapis/googleapis-gen@b2ab4b0
Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiYjJhYjRiMGEwYWUyOTA3ZTgxMmMyMDkxOThhNzRlMDg5OGFmY2IwNCJ9
* 🦉 Updates from OwlBot post-processor
See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md
---------
Co-authored-by: Owl Bot <gcf-owl-bot[bot]@users.noreply.github.com>
parthea pushed a commit that referenced this pull request Sep 18, 2025
Source-Link: googleapis/synthtool@993985f
Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:1894490910e891a385484514b22eb5133578897eb5b3c380e6d8ad475c6647cd
parthea pushed a commit that referenced this pull request Nov 22, 2025
- Pass the app_profile_id from the message
- Update unittest
Fixes internal bug #214449800
parthea added a commit that referenced this pull request Nov 24, 2025
* Enable support and testing for python 3.11
* feat: Enable support and testing for python 3.11
* build: Add kokoro configuration for python 3.11
* build: Remove kokoro configuration for python 3.11
* 🦉 Updates from OwlBot post-processor
See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md
* add unit_test_python_versions arg
* 🦉 Updates from OwlBot post-processor
See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md
Co-authored-by: Owl Bot <gcf-owl-bot[bot]@users.noreply.github.com>
Co-authored-by: Anthonios Partheniou <partheniou@google.com>
parthea pushed a commit that referenced this pull request Nov 24, 2025
* feat: add new types QueryMode, QueryPlan, ResultSetStats
feat: add QueryMode field to RunQueryRequest
feat: add ResultSetStats field to RunQueryResponse
feat: add QueryMode field to RunAggregationQueryRequest
feat: add ResultSetStats field to RunAggregationQueryResponse
PiperOrigin-RevId: 595774772
Source-Link: googleapis/googleapis@03e7ed4
Source-Link: googleapis/googleapis-gen@dc63e0d
Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiZGM2M2UwZGVhODQyM2MyMzBkNWZiMDkzN2FjYjNjOTg3MTljOTM5NSJ9
* 🦉 Updates from OwlBot post-processor
See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md
---------
Co-authored-by: Owl Bot <gcf-owl-bot[bot]@users.noreply.github.com>
parthea added a commit that referenced this pull request Nov 24, 2025
…512)
* chore(python): Use latest python runtime in prerelease_deps session
Source-Link: googleapis/synthtool@14d8b28
Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:5651442a6336971a2fb2df40fb56b3337df67cafa14c0809cc89cb34ccee1b8e
* filter warnings from google-cloud-logging 1.x
---------
Co-authored-by: Owl Bot <gcf-owl-bot[bot]@users.noreply.github.com>
Co-authored-by: Anthonios Partheniou <partheniou@google.com>
parthea added a commit that referenced this pull request Nov 24, 2025
* chore: allow releases on previous majors
* 🦉 Updates from OwlBot post-processor
See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md
Co-authored-by: Owl Bot <gcf-owl-bot[bot]@users.noreply.github.com>
parthea added a commit that referenced this pull request Nov 25, 2025
* chore: allow releases on previous majors
* 🦉 Updates from OwlBot post-processor
See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md
Co-authored-by: Owl Bot <gcf-owl-bot[bot]@users.noreply.github.com>
parthea pushed a commit that referenced this pull request Mar 6, 2026
This PR was generated using Autosynth. 🌈
Synth log will be available here:
https://source.cloud.google.com/results/invocations/ca115e36-5d95-4acd-a2d8-7ac2f22a7261/targets
- [x] To automatically regenerate this PR, check this box.
parthea pushed a commit that referenced this pull request Mar 6, 2026
Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

api: datastoreIssues related to the Datastore API.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@lucemia@dhermes@tseaver@coveralls