Skip to content

Commit 8b8993c

Browse files
committed
Use a namedtuple for prepared column meta.
Improve {maintain, read}ability
1 parent 074650b commit 8b8993c

3 files changed

Lines changed: 22 additions & 26 deletions

File tree

cassandra/protocol.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
# limitations under the License.
1414

1515
from __future__ import absolute_import # to enable import io from stdlib
16+
from collections import namedtuple
1617
import logging
1718
import socket
1819
from uuid import UUID
@@ -49,6 +50,7 @@ class NotSupportedError(Exception):
4950
class InternalError(Exception):
5051
pass
5152

53+
ColumnMetadata = namedtuple("ColumnMetadata", ['keyspace_name', 'table_name', 'name', 'type'])
5254

5355
HEADER_DIRECTION_FROM_CLIENT = 0x00
5456
HEADER_DIRECTION_TO_CLIENT = 0x80
@@ -727,7 +729,7 @@ def recv_prepared_metadata(cls, f, protocol_version, user_type_map):
727729
colcfname = read_string(f)
728730
colname = read_string(f)
729731
coltype = cls.read_type(f, user_type_map)
730-
column_metadata.append((colksname, colcfname, colname, coltype))
732+
column_metadata.append(ColumnMetadata(colksname, colcfname, colname, coltype))
731733
return column_metadata, pk_indexes
732734

733735
@classmethod

cassandra/query.py

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -380,15 +380,15 @@ def from_message(cls, query_id, column_metadata, pk_indexes, cluster_metadata, q
380380
partition_key_columns = None
381381
routing_key_indexes = None
382382

383-
ks_name, table_name, _, _ = column_metadata[0]
384-
ks_meta = cluster_metadata.keyspaces.get(ks_name)
383+
first_col = column_metadata[0]
384+
ks_meta = cluster_metadata.keyspaces.get(first_col.keyspace_name)
385385
if ks_meta:
386-
table_meta = ks_meta.tables.get(table_name)
386+
table_meta = ks_meta.tables.get(first_col.table_name)
387387
if table_meta:
388388
partition_key_columns = table_meta.partition_key
389389

390390
# make a map of {column_name: index} for each column in the statement
391-
statement_indexes = dict((c[2], i) for i, c in enumerate(column_metadata))
391+
statement_indexes = dict((c.name, i) for i, c in enumerate(column_metadata))
392392

393393
# a list of which indexes in the statement correspond to partition key items
394394
try:
@@ -447,7 +447,7 @@ def __init__(self, prepared_statement, *args, **kwargs):
447447

448448
meta = prepared_statement.column_metadata
449449
if meta:
450-
self.keyspace = meta[0][0]
450+
self.keyspace = meta[0].keyspace_name
451451

452452
Statement.__init__(self, *args, **kwargs)
453453

@@ -472,18 +472,16 @@ def bind(self, values):
472472
# sort values accordingly
473473
for col in col_meta:
474474
try:
475-
values.append(dict_values[col[2]])
475+
values.append(dict_values[col.name])
476476
except KeyError:
477477
raise KeyError(
478478
'Column name `%s` not found in bound dict.' %
479-
(col[2]))
479+
(col.name))
480480

481481
# ensure a 1-to-1 dict keys to columns relationship
482482
if len(dict_values) != len(col_meta):
483483
# find expected columns
484-
columns = set()
485-
for col in col_meta:
486-
columns.add(col[2])
484+
columns = set(col.name for col in col_meta)
487485

488486
# generate error message
489487
if len(dict_values) > len(col_meta):
@@ -516,17 +514,12 @@ def bind(self, values):
516514
if value is None:
517515
self.values.append(None)
518516
else:
519-
col_type = col_spec[-1]
520-
521517
try:
522-
self.values.append(col_type.serialize(value, proto_version))
518+
self.values.append(col_spec.type.serialize(value, proto_version))
523519
except (TypeError, struct.error) as exc:
524-
col_name = col_spec[2]
525-
expected_type = col_type
526520
actual_type = type(value)
527-
528521
message = ('Received an argument of invalid type for column "%s". '
529-
'Expected: %s, Got: %s; (%s)' % (col_name, expected_type, actual_type, exc))
522+
'Expected: %s, Got: %s; (%s)' % (col_spec.name, col_spec.type, actual_type, exc))
530523
raise TypeError(message)
531524

532525
return self

tests/unit/test_parameter_binding.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,9 @@
1818
import unittest # noqa
1919

2020
from cassandra.encoder import Encoder
21-
from cassandra.query import bind_params, ValueSequence
22-
from cassandra.query import PreparedStatement, BoundStatement
21+
from cassandra.protocol import ColumnMetadata
22+
from cassandra.query import (bind_params, ValueSequence, PreparedStatement,
23+
BoundStatement)
2324
from cassandra.cqltypes import Int32Type
2425
from cassandra.util import OrderedDict
2526

@@ -80,8 +81,8 @@ def test_invalid_argument_type(self):
8081
column_family = 'cf1'
8182

8283
column_metadata = [
83-
(keyspace, column_family, 'foo1', Int32Type),
84-
(keyspace, column_family, 'foo2', Int32Type)
84+
ColumnMetadata(keyspace, column_family, 'foo1', Int32Type),
85+
ColumnMetadata(keyspace, column_family, 'foo2', Int32Type)
8586
]
8687

8788
prepared_statement = PreparedStatement(column_metadata=column_metadata,
@@ -119,8 +120,8 @@ def test_inherit_fetch_size(self):
119120
column_family = 'cf1'
120121

121122
column_metadata = [
122-
(keyspace, column_family, 'foo1', Int32Type),
123-
(keyspace, column_family, 'foo2', Int32Type)
123+
ColumnMetadata(keyspace, column_family, 'foo1', Int32Type),
124+
ColumnMetadata(keyspace, column_family, 'foo2', Int32Type)
124125
]
125126

126127
prepared_statement = PreparedStatement(column_metadata=column_metadata,
@@ -138,8 +139,8 @@ def test_too_few_parameters_for_key(self):
138139
column_family = 'cf1'
139140

140141
column_metadata = [
141-
(keyspace, column_family, 'foo1', Int32Type),
142-
(keyspace, column_family, 'foo2', Int32Type)
142+
ColumnMetadata(keyspace, column_family, 'foo1', Int32Type),
143+
ColumnMetadata(keyspace, column_family, 'foo2', Int32Type)
143144
]
144145

145146
prepared_statement = PreparedStatement(column_metadata=column_metadata,

0 commit comments

Comments
 (0)