Browse Source

Fixed #35075 -- Added deduplicate_items parameter to BTreeIndex.

Nick Pope 3 years ago
parent
commit
45f778eded

+ 8 - 1
django/contrib/postgres/indexes.py

@@ -117,20 +117,27 @@ class BrinIndex(PostgresIndex):
 class BTreeIndex(PostgresIndex):
     suffix = "btree"
 
-    def __init__(self, *expressions, fillfactor=None, **kwargs):
+    def __init__(self, *expressions, fillfactor=None, deduplicate_items=None, **kwargs):
         self.fillfactor = fillfactor
+        self.deduplicate_items = deduplicate_items
         super().__init__(*expressions, **kwargs)
 
     def deconstruct(self):
         path, args, kwargs = super().deconstruct()
         if self.fillfactor is not None:
             kwargs["fillfactor"] = self.fillfactor
+        if self.deduplicate_items is not None:
+            kwargs["deduplicate_items"] = self.deduplicate_items
         return path, args, kwargs
 
     def get_with_params(self):
         with_params = []
         if self.fillfactor is not None:
             with_params.append("fillfactor = %d" % self.fillfactor)
+        if self.deduplicate_items is not None:
+            with_params.append(
+                "deduplicate_items = %s" % ("on" if self.deduplicate_items else "off")
+            )
         return with_params
 
 

+ 10 - 1
docs/ref/contrib/postgres/indexes.txt

@@ -46,14 +46,23 @@ available from the ``django.contrib.postgres.indexes`` module.
 ``BTreeIndex``
 ==============
 
-.. class:: BTreeIndex(*expressions, fillfactor=None, **options)
+.. class:: BTreeIndex(*expressions, fillfactor=None, deduplicate_items=None, **options)
 
     Creates a B-Tree index.
 
     Provide an integer value from 10 to 100 to the fillfactor_ parameter to
     tune how packed the index pages will be. PostgreSQL's default is 90.
 
+    Provide a boolean value to the deduplicate_items_ parameter to control
+    whether deduplication is enabled. PostgreSQL enables deduplication by
+    default.
+
+    .. versionchanged:: 5.1
+
+        The ``deduplicate_items`` parameter was added.
+
     .. _fillfactor: https://www.postgresql.org/docs/current/sql-createindex.html#SQL-CREATEINDEX-STORAGE-PARAMETERS
+    .. _deduplicate_items: https://www.postgresql.org/docs/current/btree-implementation.html#BTREE-DEDUPLICATION
 
 ``GinIndex``
 ============

+ 2 - 1
docs/releases/5.1.txt

@@ -63,7 +63,8 @@ Minor features
 :mod:`django.contrib.postgres`
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-* ...
+* :class:`~django.contrib.postgres.indexes.BTreeIndex` now supports the
+  ``deduplicate_items`` parameter.
 
 :mod:`django.contrib.redirects`
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ 1 - 0
docs/spelling_wordlist

@@ -119,6 +119,7 @@ datetimes
 declaratively
 decrementing
 deduplicates
+deduplication
 deepcopy
 deferrable
 deprecations

+ 27 - 5
tests/postgres_tests/test_indexes.py

@@ -143,12 +143,29 @@ class BTreeIndexTests(IndexTestMixin, PostgreSQLSimpleTestCase):
         self.assertEqual(BTreeIndex.suffix, "btree")
 
     def test_deconstruction(self):
-        index = BTreeIndex(fields=["title"], name="test_title_btree", fillfactor=80)
+        index = BTreeIndex(fields=["title"], name="test_title_btree")
+        path, args, kwargs = index.deconstruct()
+        self.assertEqual(path, "django.contrib.postgres.indexes.BTreeIndex")
+        self.assertEqual(args, ())
+        self.assertEqual(kwargs, {"fields": ["title"], "name": "test_title_btree"})
+
+        index = BTreeIndex(
+            fields=["title"],
+            name="test_title_btree",
+            fillfactor=80,
+            deduplicate_items=False,
+        )
         path, args, kwargs = index.deconstruct()
         self.assertEqual(path, "django.contrib.postgres.indexes.BTreeIndex")
         self.assertEqual(args, ())
         self.assertEqual(
-            kwargs, {"fields": ["title"], "name": "test_title_btree", "fillfactor": 80}
+            kwargs,
+            {
+                "fields": ["title"],
+                "name": "test_title_btree",
+                "fillfactor": 80,
+                "deduplicate_items": False,
+            },
         )
 
 
@@ -455,13 +472,18 @@ class SchemaTests(PostgreSQLTestCase):
         )
 
     def test_btree_parameters(self):
-        index_name = "integer_array_btree_fillfactor"
-        index = BTreeIndex(fields=["field"], name=index_name, fillfactor=80)
+        index_name = "integer_array_btree_parameters"
+        index = BTreeIndex(
+            fields=["field"], name=index_name, fillfactor=80, deduplicate_items=False
+        )
         with connection.schema_editor() as editor:
             editor.add_index(CharFieldModel, index)
         constraints = self.get_constraints(CharFieldModel._meta.db_table)
         self.assertEqual(constraints[index_name]["type"], BTreeIndex.suffix)
-        self.assertEqual(constraints[index_name]["options"], ["fillfactor=80"])
+        self.assertEqual(
+            constraints[index_name]["options"],
+            ["fillfactor=80", "deduplicate_items=off"],
+        )
         with connection.schema_editor() as editor:
             editor.remove_index(CharFieldModel, index)
         self.assertNotIn(