Skip to content

Commit 32f49ba

Browse files
carletesmdirolf
authored andcommitted
Optional name argument for create_index and ensure_index
1 parent af43d11 commit 32f49ba

File tree

2 files changed

+20
-5
lines changed

2 files changed

+20
-5
lines changed

pymongo/collection.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -490,7 +490,7 @@ def _gen_index_name(self, keys):
490490
"""
491491
return u"_".join([u"%s_%s" % item for item in keys])
492492

493-
def create_index(self, key_or_list, unique=False, ttl=300):
493+
def create_index(self, key_or_list, unique=False, ttl=300, name=None):
494494
"""Creates an index on this collection.
495495
496496
Takes either a single key or a list of (key, direction) pairs.
@@ -519,6 +519,8 @@ def create_index(self, key_or_list, unique=False, ttl=300):
519519
this index will be recognized by subsequent calls to
520520
:meth:`ensure_index` - see documentation for
521521
:meth:`ensure_index` for details
522+
- `name` (optional): name for the index. If none given, a name
523+
will be generated.
522524
523525
.. seealso:: :meth:`ensure_index`
524526
@@ -528,7 +530,7 @@ def create_index(self, key_or_list, unique=False, ttl=300):
528530
"""
529531
keys = helpers._index_list(key_or_list)
530532
index_doc = helpers._index_document(keys)
531-
name = self._gen_index_name(keys)
533+
name = name is not None and name or self._gen_index_name(keys)
532534
to_save = SON()
533535
to_save["name"] = name
534536
to_save["ns"] = self.__full_name
@@ -542,7 +544,7 @@ def create_index(self, key_or_list, unique=False, ttl=300):
542544
check_keys=False)
543545
return to_save["name"]
544546

545-
def ensure_index(self, key_or_list, unique=False, ttl=300):
547+
def ensure_index(self, key_or_list, unique=False, ttl=300, name=None):
546548
"""Ensures that an index exists on this collection.
547549
548550
Takes either a single key or a list of (key, direction) pairs.
@@ -577,17 +579,20 @@ def ensure_index(self, key_or_list, unique=False, ttl=300):
577579
- `ttl` (optional): time window (in seconds) during which
578580
this index will be recognized by subsequent calls to
579581
:meth:`ensure_index`
582+
- `name` (optional): name for the index. If none given, a name
583+
will be generated.
580584
581585
.. seealso:: :meth:`create_index`
582586
"""
583587
if not isinstance(key_or_list, (str, unicode, list)):
584588
raise TypeError("key_or_list must either be a single key or a list of (key, direction) pairs")
585589

586590
keys = helpers._index_list(key_or_list)
587-
name = self._gen_index_name(keys)
591+
name = name is not None and name or self._gen_index_name(keys)
588592
if self.__database.connection._cache_index(self.__database.name,
589593
self.__name, name, ttl):
590-
return self.create_index(key_or_list, unique=unique, ttl=ttl)
594+
return self.create_index(key_or_list, unique=unique, ttl=ttl,
595+
name=name)
591596
return None
592597

593598
def drop_indexes(self):

test/test_collection.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,11 @@ def test_create_index(self):
9191
count += 1
9292
self.assertEqual(count, 3)
9393

94+
db.test.drop_indexes()
95+
ix = db.test.create_index([("hello", DESCENDING),
96+
("world", ASCENDING)], name="hello_world")
97+
self.assertEquals(ix, "hello_world")
98+
9499
db.test.drop_indexes()
95100
self.assertEqual(db.system.indexes.find({"ns": u"pymongo_test.test"})
96101
.count(), 1)
@@ -127,6 +132,11 @@ def test_ensure_index(self):
127132
db.test.ensure_index("goodbye"))
128133
self.assertEqual(None, db.test.ensure_index("goodbye"))
129134

135+
db.test.drop_indexes()
136+
self.assertEqual("foo",
137+
db.test.ensure_index("goodbye", name="foo"))
138+
self.assertEqual(None, db.test.ensure_index("goodbye", name="foo"))
139+
130140
db.test.drop_indexes()
131141
self.assertEqual("goodbye_1",
132142
db.test.ensure_index("goodbye"))

0 commit comments

Comments
 (0)