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:
parent
f412add786
commit
45f778eded
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
@ -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``
|
||||||
============
|
============
|
||||||
|
@ -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`
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
@ -119,6 +119,7 @@ datetimes
|
|||||||
declaratively
|
declaratively
|
||||||
decrementing
|
decrementing
|
||||||
deduplicates
|
deduplicates
|
||||||
|
deduplication
|
||||||
deepcopy
|
deepcopy
|
||||||
deferrable
|
deferrable
|
||||||
deprecations
|
deprecations
|
||||||
|
@ -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(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user