Skip to content

Commit

Permalink
fixed issue with multiple params in a filter (Azure#15893)
Browse files Browse the repository at this point in the history
* fixed issue with multiple params in a filter

* added tests, fixed up params filtering, recordings

* adding tests for async and cosmos

* fixed up the dates test

* fixing up a new test failure not related to queries

* pylint fixes

* updating tests to insert two entities and verify only one comes back
  • Loading branch information
seankane-msft authored and rakshith91 committed Jan 8, 2021
1 parent 7896298 commit 83378dc
Show file tree
Hide file tree
Showing 38 changed files with 5,793 additions and 395 deletions.
35 changes: 32 additions & 3 deletions sdk/tables/azure-data-tables/azure/data/tables/_base_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,16 @@
TYPE_CHECKING,
)
import logging
from uuid import uuid4

from uuid import uuid4, UUID
from datetime import datetime
import six

try:
from urllib.parse import parse_qs, quote
except ImportError:
from urlparse import parse_qs # type: ignore
from urllib2 import quote # type: ignore

import six
from azure.core.configuration import Configuration
from azure.core.exceptions import ClientAuthenticationError, ResourceNotFoundError
from azure.core.pipeline import Pipeline
Expand All @@ -44,6 +44,7 @@
UserAgentPolicy,
)

from ._common_conversion import _to_utc_datetime
from ._shared_access_signature import QueryStringConstants
from ._constants import (
STORAGE_OAUTH_SCOPE,
Expand Down Expand Up @@ -337,6 +338,34 @@ def _batch_send( # pylint: disable=inconsistent-return-statements
)
return transaction_result

def _parameter_filter_substitution( # pylint: disable = R0201
self,
parameters, # type: dict[str,str]
filter # type: str # pylint: disable = W0622
):
"""Replace user defined parameter in filter
:param parameters: User defined parameters
:param filter: Filter for querying
"""
if parameters:
filter_strings = filter.split(' ')
for index, word in enumerate(filter_strings):
if word[0] == u'@':
val = parameters[word[1:]]
if val in [True, False]:
filter_strings[index] = str(val).lower()
elif isinstance(val, (float, six.integer_types)):
filter_strings[index] = str(val)
elif isinstance(val, datetime):
filter_strings[index] = "datetime'{}'".format(_to_utc_datetime(val))
elif isinstance(val, UUID):
filter_strings[index] = "guid'{}'".format(str(val))
else:
filter_strings[index] = "'{}'".format(val)
return ' '.join(filter_strings)

return filter # pylint: disable = W0622


class TransportWrapper(HttpTransport):
"""Wrapper class that ensures that an inner client created
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,23 +82,5 @@ def _validate_signed_identifiers(cls, signed_identifiers):
"""
if len(signed_identifiers) > 5:
raise ValueError(
"Too many access policies provided. The server does not support setting "
"more than 5 access policies on a single resource."
)

def _parameter_filter_substitution( # pylint: disable = R0201
self,
parameters, # type: dict[str,str]
filter, # type: str # pylint: disable = W0622
):
"""Replace user defined parameter in filter
:param parameters: User defined parameters
:param filter: Filter for querying
"""
if parameters:
filter_start = filter.split("@")[0]
selected = filter.split("@")[1]
for key, value in parameters.items():
if key == selected:
filter = filter_start.replace("@", value) # pylint: disable = W0622
return filter # pylint: disable = W0622
'Too many access policies provided. The server does not support setting '
'more than 5 access policies on a single resource.')
Original file line number Diff line number Diff line change
Expand Up @@ -61,20 +61,3 @@ def _format_url(self, hostname):
mode hostname.
"""
return "{}://{}{}".format(self.scheme, hostname, self._query_str)

def _parameter_filter_substitution( # pylint: disable = R0201
self,
parameters, # type: dict[str,str]
filter, # type: str # pylint: disable = W0622
):
"""Replace user defined parameter in filter
:param parameters: User defined parameters
:param filter: Filter for querying
"""
if parameters:
filter_start = filter.split("@")[0]
selected = filter.split("@")[1]
for key, value in parameters.items():
if key == selected:
filter = filter_start.replace("@", value) # pylint: disable = W0622
return filter # pylint: disable = W0622
Loading

0 comments on commit 83378dc

Please sign in to comment.