1
0
mirror of https://github.com/django/django.git synced 2025-06-03 18:49:12 +00:00

Fixed #35075 -- Added deduplicate_items parameter to BTreeIndex.

This commit is contained in:
Nick Pope 2021-05-29 00:53:18 +01:00 committed by Mariusz Felisiak
parent f412add786
commit 45f778eded
5 changed files with 48 additions and 8 deletions

View File

@ -117,20 +117,27 @@ class BrinIndex(PostgresIndex):
class BTreeIndex(PostgresIndex): class BTreeIndex(PostgresIndex):
suffix = "btree" suffix = "btree"
def __init__(self, *expressions, fillfactor=None, **kwargs): def __init__(self, *expressions, fillfactor=None, deduplicate_items=None, **kwargs):
self.fillfactor = fillfactor self.fillfactor = fillfactor
self.deduplicate_items = deduplicate_items
super().__init__(*expressions, **kwargs) super().__init__(*expressions, **kwargs)
def deconstruct(self): def deconstruct(self):
path, args, kwargs = super().deconstruct() path, args, kwargs = super().deconstruct()
if self.fillfactor is not None: if self.fillfactor is not None:
kwargs["fillfactor"] = self.fillfactor kwargs["fillfactor"] = self.fillfactor
if self.deduplicate_items is not None:
kwargs["deduplicate_items"] = self.deduplicate_items
return path, args, kwargs return path, args, kwargs
def get_with_params(self): def get_with_params(self):
with_params = [] with_params = []
if self.fillfactor is not None: if self.fillfactor is not None:
with_params.append("fillfactor = %d" % self.fillfactor) 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 return with_params

View File

@ -46,14 +46,23 @@ available from the ``django.contrib.postgres.indexes`` module.
``BTreeIndex`` ``BTreeIndex``
============== ==============
.. class:: BTreeIndex(*expressions, fillfactor=None, **options) .. class:: BTreeIndex(*expressions, fillfactor=None, deduplicate_items=None, **options)
Creates a B-Tree index. Creates a B-Tree index.
Provide an integer value from 10 to 100 to the fillfactor_ parameter to 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. 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 .. _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`` ``GinIndex``
============ ============

View File

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

View File

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

View File

@ -143,12 +143,29 @@ class BTreeIndexTests(IndexTestMixin, PostgreSQLSimpleTestCase):
self.assertEqual(BTreeIndex.suffix, "btree") self.assertEqual(BTreeIndex.suffix, "btree")
def test_deconstruction(self): 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() path, args, kwargs = index.deconstruct()
self.assertEqual(path, "django.contrib.postgres.indexes.BTreeIndex") self.assertEqual(path, "django.contrib.postgres.indexes.BTreeIndex")
self.assertEqual(args, ()) self.assertEqual(args, ())
self.assertEqual( 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): def test_btree_parameters(self):
index_name = "integer_array_btree_fillfactor" index_name = "integer_array_btree_parameters"
index = BTreeIndex(fields=["field"], name=index_name, fillfactor=80) index = BTreeIndex(
fields=["field"], name=index_name, fillfactor=80, deduplicate_items=False
)
with connection.schema_editor() as editor: with connection.schema_editor() as editor:
editor.add_index(CharFieldModel, index) editor.add_index(CharFieldModel, index)
constraints = self.get_constraints(CharFieldModel._meta.db_table) constraints = self.get_constraints(CharFieldModel._meta.db_table)
self.assertEqual(constraints[index_name]["type"], BTreeIndex.suffix) 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: with connection.schema_editor() as editor:
editor.remove_index(CharFieldModel, index) editor.remove_index(CharFieldModel, index)
self.assertNotIn( self.assertNotIn(