Skip to content

Commit 84c3e08

Browse files
committed
register UDT with default keyspace if none specified
PYTHON-347
1 parent 0262b2d commit 84c3e08

2 files changed

Lines changed: 23 additions & 7 deletions

File tree

cassandra/cqlengine/connection.py

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15-
from collections import namedtuple
15+
from collections import namedtuple, defaultdict
1616
import logging
1717
import six
1818

@@ -37,7 +37,7 @@
3737
# Because type models may be registered before a connection is present,
3838
# and because sessions may be replaced, we must register UDTs here, in order
3939
# to have them registered when a new session is established.
40-
udt_by_keyspace = {}
40+
udt_by_keyspace = defaultdict(dict)
4141

4242

4343
class UndefinedKeyspaceException(CQLEngineException):
@@ -191,10 +191,7 @@ def handle_lazy_connect():
191191

192192

193193
def register_udt(keyspace, type_name, klass):
194-
try:
195-
udt_by_keyspace[keyspace][type_name] = klass
196-
except KeyError:
197-
udt_by_keyspace[keyspace] = {type_name: klass}
194+
udt_by_keyspace[keyspace][type_name] = klass
198195

199196
global cluster
200197
if cluster:
@@ -205,9 +202,10 @@ def register_udt(keyspace, type_name, klass):
205202

206203

207204
def _register_known_types(cluster):
205+
from cassandra.cqlengine import models
208206
for ks_name, name_type_map in udt_by_keyspace.items():
209207
for type_name, klass in name_type_map.items():
210208
try:
211-
cluster.register_user_type(ks_name, type_name, klass)
209+
cluster.register_user_type(ks_name or models.DEFAULT_KEYSPACE, type_name, klass)
212210
except UserTypeDoesNotExist:
213211
pass # new types are covered in management sync functions

tests/integration/cqlengine/model/test_udts.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
from datetime import datetime, date, time
2020
from decimal import Decimal
21+
from mock import Mock
2122
from uuid import UUID, uuid4
2223

2324
from cassandra.cqlengine.models import Model
@@ -426,4 +427,21 @@ class UserModelText(Model):
426427
UserModelText.create(id=unicode_name, info=user_template_ascii)
427428
UserModelText.create(id=unicode_name, info=user_template_unicode)
428429

430+
def test_register_default_keyspace(self):
431+
class User(UserType):
432+
age = columns.Integer()
433+
name = columns.Text()
434+
435+
from cassandra.cqlengine import models
436+
from cassandra.cqlengine import connection
437+
438+
# None emulating no model and no default keyspace before connecting
439+
connection.udt_by_keyspace.clear()
440+
User.register_for_keyspace(None)
441+
self.assertEqual(len(connection.udt_by_keyspace), 1)
442+
self.assertIn(None, connection.udt_by_keyspace)
429443

444+
# register should be with default keyspace, not None
445+
cluster = Mock()
446+
connection._register_known_types(cluster)
447+
cluster.register_user_type.assert_called_with(models.DEFAULT_KEYSPACE, User.type_name(), User)

0 commit comments

Comments
 (0)