Skip to content

Commit 5c09da6

Browse files
committed
cqle: model attribute to disable routing key computation
PYTHON-535
1 parent a301262 commit 5c09da6

4 files changed

Lines changed: 20 additions & 6 deletions

File tree

cassandra/cqlengine/models.py

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,8 @@ class MultipleObjectsReturned(_MultipleObjectsReturned):
335335

336336
__options__ = None
337337

338+
__compute_routing_key__ = True
339+
338340
# the queryset class used for this class
339341
__queryset__ = query.ModelQuerySet
340342
__dmlquery__ = query.DMLQuery
@@ -871,10 +873,14 @@ def _get_polymorphic_base(bases):
871873
partition_keys = OrderedDict(k for k in primary_keys.items() if k[1].partition_key)
872874
clustering_keys = OrderedDict(k for k in primary_keys.items() if not k[1].partition_key)
873875

874-
key_cols = [c for c in partition_keys.values()]
875-
partition_key_index = dict((col.db_field_name, col._partition_key_index) for col in key_cols)
876-
key_cql_types = [c.cql_type for c in key_cols]
877-
key_serializer = staticmethod(lambda parts, proto_version: [t.to_binary(p, proto_version) for t, p in zip(key_cql_types, parts)])
876+
if attrs.get('__compute_routing_key__', True):
877+
key_cols = [c for c in partition_keys.values()]
878+
partition_key_index = dict((col.db_field_name, col._partition_key_index) for col in key_cols)
879+
key_cql_types = [c.cql_type for c in key_cols]
880+
key_serializer = staticmethod(lambda parts, proto_version: [t.to_binary(p, proto_version) for t, p in zip(key_cql_types, parts)])
881+
else:
882+
partition_key_index = {}
883+
key_serializer = staticmethod(lambda parts, proto_version: None)
878884

879885
# setup partition key shortcut
880886
if len(partition_keys) == 0:
@@ -998,3 +1004,8 @@ class Model(BaseModel):
9981004
"""
9991005
*Optional* Specifies a value for the discriminator column when using model inheritance.
10001006
"""
1007+
1008+
__compute_routing_key__ = True
1009+
"""
1010+
*Optional* Setting False disables computing the routing key for TokenAwareRouting
1011+
"""

cassandra/cqlengine/query.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1344,9 +1344,10 @@ def delete(self):
13441344
def _execute_statement(model, statement, consistency_level, timeout):
13451345
params = statement.get_context()
13461346
s = SimpleStatement(str(statement), consistency_level=consistency_level, fetch_size=statement.fetch_size)
1347-
if model._partition_key_index: # not available on NamedTable
1347+
if model._partition_key_index:
13481348
key_values = statement.partition_key_values(model._partition_key_index)
13491349
if not any(v is None for v in key_values):
13501350
parts = model._routing_key_from_values(key_values, connection.get_cluster().protocol_version)
13511351
s.routing_key = parts
1352+
s.keyspace = model._get_keyspace()
13521353
return connection.execute(s, params, timeout=timeout)

cassandra/cqlengine/statements.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -504,7 +504,7 @@ def _update_part_key_values(self, field_index_map, clauses, parts):
504504

505505
def partition_key_values(self, field_index_map):
506506
parts = [None] * len(field_index_map)
507-
self._update_part_key_values(field_index_map, (w for w in self.where_clauses if isinstance(w, EqualsOperator)), parts)
507+
self._update_part_key_values(field_index_map, (w for w in self.where_clauses if isinstance(w.operator, EqualsOperator)), parts)
508508
return parts
509509

510510
def add_where(self, column, operator, value, quote_field=True):

docs/api/cassandra/cqlengine/models.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ Model
7979
'tombstone_compaction_interval': '86400'},
8080
'gc_grace_seconds': '0'}
8181
82+
.. autoattribute:: __compute_routing_key__
83+
8284

8385
The base methods allow creating, storing, and querying modeled objects.
8486

0 commit comments

Comments
 (0)