mirror of
				https://github.com/SectorLabs/django-localized-fields.git
				synced 2025-11-03 19:58:56 +03:00 
			
		
		
		
	HStoreIndex, unique indexes on hstore keys
This commit is contained in:
		
							
								
								
									
										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
 | 
			
		||||
        })
 | 
			
		||||
		Reference in New Issue
	
	Block a user