create and update GNI indexes

This commit is contained in:
j 2013-01-31 07:54:39 +00:00
parent 90758ca156
commit c748527921
2 changed files with 43 additions and 5 deletions

View file

@ -1,11 +1,14 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# vi:si:et:sw=4:sts=4:ts=4 # vi:si:et:sw=4:sts=4:ts=4
from optparse import make_option
from django.core.management.base import BaseCommand from django.core.management.base import BaseCommand
from django.db import connection
from django.conf import settings from django.conf import settings
import monkey_patch.models import monkey_patch.models
from ... import models from ... import models
import time
class Command(BaseCommand): class Command(BaseCommand):
@ -14,8 +17,33 @@ class Command(BaseCommand):
""" """
help = 'sql create statements for find tables to use trigram index' help = 'sql create statements for find tables to use trigram index'
args = '' args = ''
option_list = BaseCommand.option_list + (
make_option('--debug', action='store_true', dest='debug',
default=False, help='print sql commans'),
)
def handle(self, **options): def handle(self, **options):
print 'CREATE INDEX item_itemfind_value_idx ON item_itemfind USING gin (value gin_trgm_ops);' cursor = connection.cursor()
print '' def create_table(index, table, key):
print 'CREATE INDEX clip_clip_findvalue_idx ON clip_clip USING gin (findvalue gin_trgm_ops);' sql = 'CREATE INDEX "%s" ON "%s" USING gin ("%s" gin_trgm_ops)' % (index, table, key)
if options['debug']:
print sql
cursor.execute(sql)
if settings.DB_GIN_TRGM:
table_name = models.ItemFind._meta.db_table
indexes = connection.introspection.get_indexes(cursor, table_name)
name = 'value'
if name not in indexes:
create_table("%s_%s_idx"%(table_name, name), table_name, name)
table_name = models.Clip._meta.db_table
cursor = connection.cursor()
indexes = connection.introspection.get_indexes(cursor, table_name)
name = 'findvalue'
if name not in indexes:
create_table("%s_%s_idx"%(table_name, name), table_name, name)
for name in settings.CONFIG['clipLayers']:
name = '%s_findvalue' % name
if name not in indexes:
create_table("%s_%s_idx"%(table_name, name), table_name, name)

View file

@ -4,6 +4,7 @@ from optparse import make_option
from django.core.management.base import BaseCommand from django.core.management.base import BaseCommand
from django.db import connection, transaction from django.db import connection, transaction
from django.conf import settings
from django.db.models import fields from django.db.models import fields
import monkey_patch.models import monkey_patch.models
@ -75,6 +76,10 @@ class Command(BaseCommand):
if name not in model_fields: if name not in model_fields:
sql = 'ALTER TABLE "%s" DROP COLUMN "%s"' % (table_name, name) sql = 'ALTER TABLE "%s" DROP COLUMN "%s"' % (table_name, name)
changes.append(sql) changes.append(sql)
if settings.DB_GIN_TRGM:
gin_indexes = ['%s_findvalue' % n for n in settings.CONFIG['clipLayers']]
else:
gin_indexes = []
for f in clip.models.Clip._meta.fields: for f in clip.models.Clip._meta.fields:
if not f.primary_key and not isinstance(f, fields.related.ForeignKey): if not f.primary_key and not isinstance(f, fields.related.ForeignKey):
name = f.name name = f.name
@ -82,8 +87,13 @@ class Command(BaseCommand):
if name not in db_fields: if name not in db_fields:
sql = 'ALTER TABLE "%s" ADD COLUMN "%s" %s' % (table_name, name, col_type) sql = 'ALTER TABLE "%s" ADD COLUMN "%s" %s' % (table_name, name, col_type)
changes.append(sql) changes.append(sql)
sql = 'CREATE INDEX "%s_%s_idx" ON "%s" ("%s")' % (table_name, name, if name in gin_indexes:
table_name, name) sql = 'CREATE INDEX "%s_%s_idx" ON "%s" USING gin ("%s" gin_trgm_ops);' % (
table_name, name, table_name, name
)
else:
sql = 'CREATE INDEX "%s_%s_idx" ON "%s" ("%s")' % (table_name, name,
table_name, name)
changes.append(sql) changes.append(sql)
sql = 'ALTER TABLE "%s" ALTER COLUMN "%s" SET NOT NULL' % (table_name, name) sql = 'ALTER TABLE "%s" ALTER COLUMN "%s" SET NOT NULL' % (table_name, name)
changes.append(sql) changes.append(sql)