Skip to content

Commit 3bbac23

Browse files
authored
Merge pull request #117 from google/create-index-options
Add support for NULL_FILTERED and UNIQUE in CreateIndex.
2 parents e433943 + cf5a9ab commit 3bbac23

2 files changed

Lines changed: 39 additions & 8 deletions

File tree

spanner_orm/admin/update.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -240,16 +240,25 @@ def __init__(self,
240240
index_name: str,
241241
columns: Iterable[str],
242242
interleaved: Optional[str] = None,
243+
null_filtered: bool = False,
244+
unique: bool = False,
243245
storing_columns: Optional[Iterable[str]] = None):
244246
self._table = table_name
245247
self._index = index_name
246248
self._columns = columns
247249
self._parent_table = interleaved
250+
self._null_filtered = null_filtered
251+
self._unique = unique
248252
self._storing_columns = storing_columns or []
249253

250254
def ddl(self) -> str:
251-
statement = 'CREATE INDEX {} ON {} ({})'.format(self._index, self._table,
252-
', '.join(self._columns))
255+
statement = 'CREATE'
256+
if self._unique:
257+
statement += ' UNIQUE'
258+
if self._null_filtered:
259+
statement += ' NULL_FILTERED'
260+
statement += (f' INDEX {self._index} '
261+
f'ON {self._table} ({", ".join(self._columns)})')
253262
if self._storing_columns:
254263
statement += 'STORING ({})'.format(', '.join(self._storing_columns))
255264
if self._parent_table:

spanner_orm/tests/update_test.py

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,15 @@
1616
import unittest
1717
from unittest import mock
1818

19+
from absl.testing import parameterized
20+
1921
from spanner_orm import error
2022
from spanner_orm import field
2123
from spanner_orm.admin import update
2224
from spanner_orm.tests import models
2325

2426

25-
class UpdateTest(unittest.TestCase):
27+
class UpdateTest(parameterized.TestCase):
2628

2729
@mock.patch('spanner_orm.admin.metadata.SpannerMetadata.model')
2830
def test_add_column(self, get_model):
@@ -118,15 +120,35 @@ def test_drop_table(self, get_model, tables, indexes):
118120
test_update.validate()
119121
self.assertEqual(test_update.ddl(), 'DROP TABLE {}'.format(table_name))
120122

123+
@parameterized.named_parameters(
124+
(
125+
'basic',
126+
update.CreateIndex(
127+
table_name=models.SmallTestModel.table,
128+
index_name='foo',
129+
columns=['value_1'],
130+
),
131+
f'CREATE INDEX foo ON {models.SmallTestModel.table} (value_1)',
132+
),
133+
(
134+
'with_options',
135+
update.CreateIndex(
136+
table_name=models.SmallTestModel.table,
137+
index_name='foo',
138+
columns=['value_1'],
139+
null_filtered=True,
140+
unique=True,
141+
),
142+
(f'CREATE UNIQUE NULL_FILTERED INDEX foo '
143+
f'ON {models.SmallTestModel.table} (value_1)'),
144+
),
145+
)
121146
@mock.patch('spanner_orm.admin.metadata.SpannerMetadata.model')
122-
def test_add_index(self, get_model):
123-
table_name = models.SmallTestModel.table
147+
def test_add_index(self, test_update, expected_ddl, get_model):
124148
get_model.return_value = models.SmallTestModel
125149

126-
test_update = update.CreateIndex(table_name, 'foo', ['value_1'])
127150
test_update.validate()
128-
self.assertEqual(test_update.ddl(),
129-
'CREATE INDEX foo ON {} (value_1)'.format(table_name))
151+
self.assertEqual(test_update.ddl(), expected_ddl)
130152

131153

132154
if __name__ == '__main__':

0 commit comments

Comments
 (0)