diff options
author | Gorka Eguileor <geguileo@redhat.com> | 2015-10-08 13:24:02 +0200 |
---|---|---|
committer | Gorka Eguileor <geguileo@redhat.com> | 2015-10-08 13:24:02 +0200 |
commit | 44e5a31ccee5335962602327132a4196fb1c7911 (patch) | |
tree | 186bc79852b50f11e1ed75ce397bab157838c30e | |
parent | c6ba1a7d4c2b1c081cfff39b3455d1684ec147be (diff) | |
download | sqlalchemy-pr/200.tar.gz |
Reduce the numbers of calls to isinstancepr/200
Change _process_colparams method to remove duplicate isinstance calls
and try to speed up processing of the parameters.
-rw-r--r-- | .cache/v/cache/lastfailed | 1 | ||||
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | lib/sqlalchemy/sql/dml.py | 66 |
3 files changed, 33 insertions, 35 deletions
diff --git a/.cache/v/cache/lastfailed b/.cache/v/cache/lastfailed deleted file mode 100644 index 9e26dfeeb..000000000 --- a/.cache/v/cache/lastfailed +++ /dev/null @@ -1 +0,0 @@ -{}
\ No newline at end of file diff --git a/.gitignore b/.gitignore index 55066f843..81fd2d9ed 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,4 @@ coverage.xml sqlnet.log /mapping_setup.py /test.py +/.cache/ diff --git a/lib/sqlalchemy/sql/dml.py b/lib/sqlalchemy/sql/dml.py index 3de54327a..7243e56e1 100644 --- a/lib/sqlalchemy/sql/dml.py +++ b/lib/sqlalchemy/sql/dml.py @@ -31,28 +31,28 @@ class UpdateBase(DialectKWArgs, HasPrefixes, Executable, ClauseElement): _prefixes = () def _process_colparams(self, parameters): - # Check if params is a value list/tuple representing a dictionary. - is_ordered = (isinstance(parameters, (list, tuple)) and - len(parameters) > 0 and - all(isinstance(p, (list, tuple)) and len(p) == 2 and - isinstance(p[0], schema.Column) for p in parameters)) - def process_single(p): - if not is_ordered and isinstance(p, (list, tuple)): + if isinstance(p, (list, tuple)): return dict((c.key, pval) for c, pval in zip(self.table.c, p)) else: return p - if (not is_ordered and isinstance(parameters, (list, tuple)) and - parameters and isinstance(parameters[0], (list, tuple, dict))): - if not self._supports_multi_parameters: - raise exc.InvalidRequestError( - "This construct does not support " - "multiple parameter sets.") + if parameters and isinstance(parameters, (list, tuple)): + p0 = parameters[0] + is_lt = isinstance(p0, (list, tuple)) + # If it's an ordered dict in the form of value pairs return it + if is_lt and len(p0) == 2 and isinstance(p0[0], schema.Column): + return parameters, False, True - return [process_single(p) for p in parameters], True, is_ordered - else: - return process_single(parameters), False, is_ordered + if is_lt or isinstance(p0, dict): + if not self._supports_multi_parameters: + raise exc.InvalidRequestError( + "This construct does not support " + "multiple parameter sets.") + + return [process_single(p) for p in parameters], True, False + + return process_single(parameters), False, False def params(self, *arg, **kw): """Set the parameters for the statement. @@ -187,10 +187,8 @@ class ValuesBase(UpdateBase): def __init__(self, table, values, prefixes): self.table = _interpret_as_from(table) - colparams = self._process_colparams(values) - self.parameters = colparams[0] - self._has_multi_parameters = colparams[1] - self._preserve_parameter_order = colparams[2] + self.parameters, self._has_multi_parameters, \ + self._preserve_parameter_order = self._process_colparams(values) if prefixes: self._setup_prefixes(prefixes) @@ -321,28 +319,30 @@ class ValuesBase(UpdateBase): else: v = {} - colparams = self._process_colparams(v) - had_multi_parameters = self._has_multi_parameters - self._has_multi_parameters = colparams[1] - self._preserve_parameter_order = colparams[2] - if self.parameters is None: - self.parameters = colparams[0] + self.parameters, self._has_multi_parameters, \ + self._preserve_parameter_order = self._process_colparams(v) else: - if had_multi_parameters: + if self._has_multi_parameters: + self.parameters = list(self.parameters) + p, self._has_multi_parameters, \ + self._preserve_parameter_order = self._process_colparams(v) + if not self._has_multi_parameters: raise exc.ArgumentError( "Can't mix single-values and multiple values " "formats in one statement") - self.parameters.extend(colparams[0]) + self.parameters.extend(p) else: self.parameters = self.parameters.copy() + p, self._has_multi_parameters, \ + self._preserve_parameter_order = self._process_colparams(v) if self._has_multi_parameters: raise exc.ArgumentError( "Can't mix single-values and multiple values " "formats in one statement") - self.parameters.update(colparams[0]) + self.parameters.update(p) if kwargs: if self._has_multi_parameters: @@ -556,11 +556,9 @@ class Insert(ValuesBase): raise exc.InvalidRequestError( "This construct already inserts value expressions") - colparams = self._process_colparams(dict((_column_as_key(n), Null()) - for n in names)) - self.parameters = colparams[0] - self._has_multi_parameters = colparams[1] - self._preserve_parameter_order = colparams[2] + self.parameters, self._has_multi_parameters, \ + self._preserve_parameter_order = self._process_colparams( + dict((_column_as_key(n), Null()) for n in names)) self.select_names = names self.inline = True |