mirror of
https://github.com/SectorLabs/django-localized-fields.git
synced 2025-04-24 19:32:53 +03:00
HStoreIndex, unique indexes on hstore keys
This commit is contained in:
parent
c38df2589e
commit
ed1559ec31
130
localized_fields/hstore_index.py
Normal file
130
localized_fields/hstore_index.py
Normal file
@ -0,0 +1,130 @@
|
||||
from typing import List
|
||||
|
||||
from django.db import models
|
||||
|
||||
|
||||
class HStoreIndex(models.Index):
|
||||
"""Allows creating a index on a specific HStore index.
|
||||
|
||||
Note: pieces of code in this class have been copied
|
||||
from the base class. There was no way around this."""
|
||||
|
||||
def __init__(self, field: str, keys: List[str], unique: bool=False,
|
||||
name: str=''):
|
||||
"""Initializes a new instance of :see:HStoreIndex.
|
||||
|
||||
Arguments:
|
||||
field:
|
||||
Name of the hstore field for
|
||||
which's keys to create a index for.
|
||||
|
||||
keys:
|
||||
The name of the hstore keys to
|
||||
create the index on.
|
||||
|
||||
unique:
|
||||
Whether this index should
|
||||
be marked as UNIQUE.
|
||||
|
||||
name:
|
||||
The name of the index. If left
|
||||
empty, one will be generated.
|
||||
"""
|
||||
|
||||
self.field = field
|
||||
self.keys = keys
|
||||
self.unique = unique
|
||||
|
||||
# this will eventually set self.name
|
||||
super(HStoreIndex, self).__init__(
|
||||
fields=[field],
|
||||
name=name
|
||||
)
|
||||
|
||||
def get_sql_create_template_values(self, model, schema_editor, using):
|
||||
"""Gets the values for the SQL template.
|
||||
|
||||
Arguments:
|
||||
model:
|
||||
The model this index applies to.
|
||||
|
||||
schema_editor:
|
||||
The schema editor to modify the schema.
|
||||
|
||||
using:
|
||||
Optional: "USING" statement.
|
||||
|
||||
Returns:
|
||||
Dictionary of keys to pass into the SQL template.
|
||||
"""
|
||||
|
||||
fields = [model._meta.get_field(field_name) for field_name, order in self.fields_orders]
|
||||
tablespace_sql = schema_editor._get_index_tablespace_sql(model, fields)
|
||||
quote_name = schema_editor.quote_name
|
||||
|
||||
columns = [
|
||||
'(%s->\'%s\')' % (self.field, key)
|
||||
for key in self.keys
|
||||
]
|
||||
|
||||
return {
|
||||
'table': quote_name(model._meta.db_table),
|
||||
'name': quote_name(self.name),
|
||||
'columns': ', '.join(columns),
|
||||
'using': using,
|
||||
'extra': tablespace_sql,
|
||||
}
|
||||
|
||||
def create_sql(self, model, schema_editor, using=''):
|
||||
"""Gets the SQL to execute when creating the index.
|
||||
|
||||
Arguments:
|
||||
model:
|
||||
The model this index applies to.
|
||||
|
||||
schema_editor:
|
||||
The schema editor to modify the schema.
|
||||
|
||||
using:
|
||||
Optional: "USING" statement.
|
||||
|
||||
Returns:
|
||||
SQL string to execute to create this index.
|
||||
"""
|
||||
|
||||
sql_create_index = schema_editor.sql_create_index
|
||||
if self.unique:
|
||||
sql_create_index = sql_create_index.replace('CREATE', 'CREATE UNIQUE')
|
||||
sql_parameters = self.get_sql_create_template_values(model, schema_editor, using)
|
||||
return sql_create_index % sql_parameters
|
||||
|
||||
def remove_sql(self, model, schema_editor):
|
||||
"""Gets the SQL to execute to remove this index.
|
||||
|
||||
Arguments:
|
||||
model:
|
||||
The model this index applies to.
|
||||
|
||||
schema_editor:
|
||||
The schema editor to modify the schema.
|
||||
|
||||
Returns:
|
||||
SQL string to execute to remove this index.
|
||||
"""
|
||||
quote_name = schema_editor.quote_name
|
||||
return schema_editor.sql_delete_index % {
|
||||
'table': quote_name(model._meta.db_table),
|
||||
'name': quote_name(self.name),
|
||||
}
|
||||
|
||||
def deconstruct(self):
|
||||
"""Gets the values to pass to :see:__init__ when
|
||||
re-creating this object."""
|
||||
|
||||
path = '%s.%s' % (self.__class__.__module__, self.__class__.__name__)
|
||||
return (path, (), {
|
||||
'field': self.field,
|
||||
'keys': self.keys,
|
||||
'unique': self.unique,
|
||||
'name': self.name
|
||||
})
|
Loading…
x
Reference in New Issue
Block a user