def test_generated_name_ends_with_partial(self): idx = PartialIndex(fields=['a', 'b'], unique=False, where_postgresql='a = false', where_sqlite='a = 0') idx.set_name_with_model(AB) self.assertEqual(idx.name[-8:], '_partial')
class Meta: indexes = [ PartialIndex(fields=['-order'], unique=False, where=PQ(is_complete=False)), PartialIndex(fields=['group'], unique=True, where=PQ(is_complete=False)), ]
class Meta: db_table = "recipient_lookup" indexes = [ PartialIndex(fields=["duns"], unique=True, where=PQ(duns__isnull=False)), PartialIndex(fields=["parent_duns"], unique=False, where=PQ(parent_duns__isnull=False)), ]
class Meta: indexes = [ PartialIndex(fields=['-order'], unique=False, where_postgresql='is_complete = false', where_sqlite='is_complete = 0'), PartialIndex(fields=['group'], unique=True, where_postgresql='is_complete = false', where_sqlite='is_complete = 0'), ]
class Meta: indexes = [ PartialIndex(fields=['room', 'label'], unique=True, where=PQ(deleted_at__isnull=True)), PartialIndex(fields=['user', 'label'], unique=True, where=PQ(deleted_at__isnull=True)), PartialIndex(fields=['uuid'], unique=True, where=PQ(deleted_at__isnull=True)), ] unique_together = [['room', 'user']] # Regardless of deletion status
def test_where_changes_generated_name(self): idx1 = PartialIndex(fields=['a', 'b'], unique=False, where='a IS NULL') idx1.set_name_with_model(AB) idx2 = PartialIndex(fields=['a', 'b'], unique=False, where='a IS NOT NULL') idx2.set_name_with_model(AB) self.assertNotEqual(idx1.name, idx2.name)
def test_all_where_different(self): with self.assertRaisesRegexp(ValueError, '^If providing a single'): PartialIndex(fields=['a', 'b'], unique=True, where='a IS NULL', where_postgresql='a IS NOT NULL', where_sqlite='a = 3')
def test_where_sqlite_changes_generated_name(self): idx1 = PartialIndex(fields=['a', 'b'], unique=False, where_postgresql='a = false', where_sqlite='a = 0') idx1.set_name_with_model(AB) idx2 = PartialIndex(fields=['a', 'b'], unique=False, where_postgresql='a = false', where_sqlite='a = 1') idx2.set_name_with_model(AB) self.assertNotEqual(idx1.name, idx2.name)
def test_unique_text(self): index_name = 'roombookingtext_test_idx' index = PartialIndex(fields=['user', 'room'], name=index_name, unique=True, where='deleted_at IS NULL') self.assertAddRemoveConstraint(RoomBookingText, index_name, index, { 'columns': ['user_id', 'room_id'], 'primary_key': False, 'check': False, 'index': True, 'unique': True, })
def test_unique_q(self): index_name = 'roombookingq_test_idx' index = PartialIndex(fields=['user', 'room'], name=index_name, unique=True, where=PQ(deleted_at__isnull=True)) self.assertAddRemoveConstraint(RoomBookingQ, index_name, index, { 'columns': ['user_id', 'room_id'], 'primary_key': False, 'check': False, 'index': True, 'unique': True, })
def test_not_unique_q(self): index_name = 'jobq_test_idx' index = PartialIndex(fields=['-group'], name=index_name, unique=False, where=PQ(is_complete=False)) self.assertAddRemoveConstraint(JobQ, index_name, index, { 'columns': ['group'], 'orders': ['DESC'], 'primary_key': False, 'check': False, 'index': True, 'unique': False, })
def test_not_unique_text(self): index_name = 'jobtext_test_idx' index = PartialIndex(fields=['-group'], name=index_name, unique=False, where_postgresql='is_complete = false', where_sqlite='is_complete = 0') self.assertAddRemoveConstraint(JobText, index_name, index, { 'columns': ['group'], 'orders': ['DESC'], 'primary_key': False, 'check': False, 'index': True, 'unique': False, })
class Meta: unique_together = [ # HACK work around unique=True implies db_index=True # https://code.djangoproject.com/ticket/24082 # Avoid extra varchar_pattern_ops index # since we do not do LIKE queries on these # https://stackoverflow.com/a/50926644/10840 ("key",), ] index_together = [("parent_id", "type_code", "name")] indexes = [ PartialIndex( fields=['expires_on'], unique=False, where=PQ(expires_on__isnull=False), ), PartialIndex( fields=['type_code', 'created_on'], unique=False, where=PQ(domain='icds-cas'), ), ]
class PartialIndexMultiTextWhereTest(SimpleTestCase): """Test simple fields and methods on the PartialIndex class with separate where_vendor='' arguments.""" def setUp(self): self.idx = PartialIndex(fields=['a', 'b'], unique=True, where_postgresql='a = false', where_sqlite='a = 0') def test_no_unique(self): with self.assertRaisesMessage(ValueError, 'Unique must be True or False'): PartialIndex(fields=['a', 'b'], where_postgresql='a = false', where_sqlite='a = 0') def test_fields(self): self.assertEqual(self.idx.unique, True) self.assertEqual(self.idx.where, '') self.assertEqual(self.idx.where_postgresql, 'a = false') self.assertEqual(self.idx.where_sqlite, 'a = 0') def test_repr(self): self.assertEqual(repr(self.idx), "<PartialIndex: fields='a, b', unique=True, where_postgresql='a = false', where_sqlite='a = 0'>") def test_deconstruct(self): path, args, kwargs = self.idx.deconstruct() self.assertEqual(path, 'partial_index.PartialIndex') self.assertEqual((), args) self.assertEqual(kwargs['fields'], ['a', 'b']) self.assertEqual(kwargs['unique'], True) self.assertNotIn('where', kwargs) self.assertEqual(kwargs['where_postgresql'], 'a = false') self.assertEqual(kwargs['where_sqlite'], 'a = 0') self.assertIn('name', kwargs) # Exact value of name is not tested. def test_suffix(self): self.assertEqual(self.idx.suffix, 'partial') def test_generated_name_ends_with_partial(self): idx = PartialIndex(fields=['a', 'b'], unique=False, where_postgresql='a = false', where_sqlite='a = 0') idx.set_name_with_model(AB) self.assertEqual(idx.name[-8:], '_partial') def test_where_postgresql_changes_generated_name(self): idx1 = PartialIndex(fields=['a', 'b'], unique=False, where_postgresql='a = false', where_sqlite='a = 0') idx1.set_name_with_model(AB) idx2 = PartialIndex(fields=['a', 'b'], unique=False, where_postgresql='a = true', where_sqlite='a = 0') idx2.set_name_with_model(AB) self.assertNotEqual(idx1.name, idx2.name) def test_where_sqlite_changes_generated_name(self): idx1 = PartialIndex(fields=['a', 'b'], unique=False, where_postgresql='a = false', where_sqlite='a = 0') idx1.set_name_with_model(AB) idx2 = PartialIndex(fields=['a', 'b'], unique=False, where_postgresql='a = false', where_sqlite='a = 1') idx2.set_name_with_model(AB) self.assertNotEqual(idx1.name, idx2.name)
class Meta: indexes = [ models.Index(fields=[ "date_joined", ]), models.Index(fields=[ "gender", ]), models.Index(fields=[ "last_login", ]), models.Index(fields=[ "updated_at", ]), PartialIndex(fields=[ "is_active", ], unique=False, where_postgresql="is_active = false"), PartialIndex(fields=[ "email_verified", ], unique=False, where_postgresql="email_verified = true"), PartialIndex(fields=[ "msisdn_verified", ], unique=False, where_postgresql="msisdn_verified = true"), TrigramIndex(fields=["username"], ), TrigramIndex(fields=["msisdn"], ), TrigramIndex(fields=["email"], ), TrigramIndex(fields=["first_name"], ), TrigramIndex(fields=["last_name"], ), TrigramIndex(fields=["nickname"], ), TrigramIndex(fields=["q"], ), ]
def test_unique(self): num_constraints_before = len(self.get_constraints(RoomBooking)) # Add the index index_name = 'roombooking_test_idx' index = PartialIndex(fields=['user', 'room'], name=index_name, unique=True, where='deleted_at IS NULL') with self.schema_editor() as editor: editor.add_index(RoomBooking, index) constraints = self.get_constraints(RoomBooking) self.assertEqual(len(constraints), num_constraints_before + 1) self.assertEqual(constraints[index_name]['columns'], ['user_id', 'room_id']) self.assertEqual(constraints[index_name]['primary_key'], False) self.assertEqual(constraints[index_name]['check'], False) self.assertEqual(constraints[index_name]['index'], True) self.assertEqual(constraints[index_name]['unique'], True) # Drop the index with self.schema_editor() as editor: editor.remove_index(RoomBooking, index) constraints = self.get_constraints(RoomBooking) self.assertEqual(len(constraints), num_constraints_before) self.assertNotIn(index_name, constraints)
def test_not_unique(self): num_constraints_before = len(self.get_constraints(Job)) # Add the index index_name = 'job_test_idx' index = PartialIndex(fields=['-group'], name=index_name, unique=False, where_postgresql='is_complete = false', where_sqlite='is_complete = 0') with self.schema_editor() as editor: editor.add_index(Job, index) constraints = self.get_constraints(Job) self.assertEqual(len(constraints), num_constraints_before + 1) self.assertEqual(constraints[index_name]['columns'], ['group']) self.assertEqual(constraints[index_name]['orders'], ['DESC']) self.assertEqual(constraints[index_name]['primary_key'], False) self.assertEqual(constraints[index_name]['check'], False) self.assertEqual(constraints[index_name]['index'], True) self.assertEqual(constraints[index_name]['unique'], False) # Drop the index with self.schema_editor() as editor: editor.remove_index(Job, index) constraints = self.get_constraints(Job) self.assertEqual(len(constraints), num_constraints_before) self.assertNotIn(index_name, constraints)
def test_pg_and_sqlite_where_same(self): with self.assertRaisesRegexp(ValueError, 'must be different'): PartialIndex(fields=['a', 'b'], unique=True, where_postgresql='a IS NULL', where_sqlite='a IS NULL')
def test_where_not_provided(self): # Same as text based test - keep a copy here for the future when text-based are removed entirely. with self.assertRaisesRegexp(ValueError, 'must be provided'): PartialIndex(fields=['a', 'b'], unique=True)
def test_single_and_sqlite_where_different(self): with self.assertRaisesRegexp(ValueError, 'must not provide'): PartialIndex(fields=['a', 'b'], unique=True, where='a IS NULL', where_sqlite='a IS NOT NULL')
def test_all_where_same(self): with self.assertRaisesRegexp(ValueError, 'must not provide'): PartialIndex(fields=['a', 'b'], unique=True, where='a IS NULL', where_postgresql='a IS NULL', where_sqlite='a IS NULL')
def test_where_changes_generated_name(self): idx1 = PartialIndex(fields=['a', 'b'], unique=False, where=PQ(a__isnull=True)) idx1.set_name_with_model(AB) idx2 = PartialIndex(fields=['a', 'b'], unique=False, where=PQ(a__isnull=False)) idx2.set_name_with_model(AB) self.assertNotEqual(idx1.name, idx2.name)
def test_same_args_same_name(self): idx1 = PartialIndex(fields=['a', 'b'], unique=False, where=PQ(a__isnull=True)) idx1.set_name_with_model(AB) idx2 = PartialIndex(fields=['a', 'b'], unique=False, where=PQ(a__isnull=True)) idx2.set_name_with_model(AB) self.assertEqual(idx1.name, idx2.name)
def test_generated_name_ends_with_partial(self): idx = PartialIndex(fields=['a', 'b'], unique=False, where=PQ(a__isnull=True)) idx.set_name_with_model(AB) self.assertEqual(idx.name[-8:], '_partial')
def test_single_q_and_pg_and_sqlite(self): with self.assertRaisesRegexp(ValueError, 'must not provide'): PartialIndex(fields=['a', 'b'], unique=True, where=PQ(a__isnull=True), where_postgresql='a IS NULL', where_sqlite='a IS NULL')
def test_no_unique(self): with self.assertRaisesMessage(ValueError, 'Unique must be True or False'): PartialIndex(fields=['a', 'b'], where='a is null')
def setUp(self): self.idx = PartialIndex(fields=['a', 'b'], unique=True, where='a IS NULL')
class PartialIndexSinglePQWhereTest(SimpleTestCase): """Test simple fields and methods on the PartialIndex class with a Q-based where predicate.""" def setUp(self): self.idx = PartialIndex(fields=['a', 'b'], unique=True, where=PQ(a__isnull=True)) def test_no_unique(self): with self.assertRaisesMessage(ValueError, 'Unique must be True or False'): PartialIndex(fields=['a', 'b'], where=PQ(a__isnull=True)) def test_fields(self): self.assertEqual(self.idx.unique, True) self.assertEqual(self.idx.where, PQ(a__isnull=True)) self.assertEqual(self.idx.where_postgresql, '') self.assertEqual(self.idx.where_sqlite, '') def test_repr(self): self.assertEqual(repr(self.idx), "<PartialIndex: fields='a, b', unique=True, where=<PQ: (AND: ('a__isnull', True))>>") def test_deconstruct_pq(self): path, args, kwargs = self.idx.deconstruct() self.assertEqual(path, 'partial_index.PartialIndex') self.assertEqual((), args) self.assertEqual(kwargs['fields'], ['a', 'b']) self.assertEqual(kwargs['unique'], True) self.assertEqual(kwargs['where'], PQ(a__isnull=True)) self.assertNotIn('where_postgresql', kwargs) self.assertNotIn('where_sqlite', kwargs) self.assertIn('name', kwargs) # Exact value of name is not tested. def test_suffix(self): self.assertEqual(self.idx.suffix, 'partial') def test_generated_name_ends_with_partial(self): idx = PartialIndex(fields=['a', 'b'], unique=False, where=PQ(a__isnull=True)) idx.set_name_with_model(AB) self.assertEqual(idx.name[-8:], '_partial') def test_same_args_same_name(self): idx1 = PartialIndex(fields=['a', 'b'], unique=False, where=PQ(a__isnull=True)) idx1.set_name_with_model(AB) idx2 = PartialIndex(fields=['a', 'b'], unique=False, where=PQ(a__isnull=True)) idx2.set_name_with_model(AB) self.assertEqual(idx1.name, idx2.name) def test_field_sort_changes_generated_name(self): idx1 = PartialIndex(fields=['a', 'b'], unique=False, where=PQ(a__isnull=True)) idx1.set_name_with_model(AB) idx2 = PartialIndex(fields=['a', '-b'], unique=False, where=PQ(a__isnull=True)) idx2.set_name_with_model(AB) self.assertNotEqual(idx1.name, idx2.name) def test_field_order_changes_generated_name(self): idx1 = PartialIndex(fields=['a', 'b'], unique=False, where=PQ(a__isnull=True)) idx1.set_name_with_model(AB) idx2 = PartialIndex(fields=['b', 'a'], unique=False, where=PQ(a__isnull=True)) idx2.set_name_with_model(AB) self.assertNotEqual(idx1.name, idx2.name) def test_unique_changes_generated_name(self): idx1 = PartialIndex(fields=['a', 'b'], unique=False, where=PQ(a__isnull=True)) idx1.set_name_with_model(AB) idx2 = PartialIndex(fields=['a', 'b'], unique=True, where=PQ(a__isnull=True)) idx2.set_name_with_model(AB) self.assertNotEqual(idx1.name, idx2.name) def test_where_changes_generated_name(self): idx1 = PartialIndex(fields=['a', 'b'], unique=False, where=PQ(a__isnull=True)) idx1.set_name_with_model(AB) idx2 = PartialIndex(fields=['a', 'b'], unique=False, where=PQ(a__isnull=False)) idx2.set_name_with_model(AB) self.assertNotEqual(idx1.name, idx2.name)
class Meta: indexes = [PartialIndex(fields=['user', 'room'], unique=True, where='deleted_at IS NULL')]
def setUp(self): self.idx = PartialIndex(fields=['a', 'b'], unique=True, where=PQ(a__isnull=True))