Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fixed issue with multiple params in a filter #15893

Merged
merged 8 commits into from
Jan 7, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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