mirror of
				https://github.com/SectorLabs/django-localized-fields.git
				synced 2025-10-30 10:38:58 +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