mirror of
https://github.com/SectorLabs/django-localized-fields.git
synced 2025-04-24 19:32:53 +03:00
133 lines
3.8 KiB
Python
133 lines
3.8 KiB
Python
"""This module is unused, but should be contributed to Django."""
|
|
|
|
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
|
|
})
|