60 lines
2.2 KiB
Python
60 lines
2.2 KiB
Python
|
from pydal import DAL, Field
|
||
|
from ._compat import unittest
|
||
|
from ._adapt import DEFAULT_URI, IS_POSTGRESQL, drop
|
||
|
|
||
|
|
||
|
class TestIndexesBasic(unittest.TestCase):
|
||
|
def testRun(self):
|
||
|
db = DAL(DEFAULT_URI, check_reserved=['all'])
|
||
|
db.define_table('tt', Field('aa'))
|
||
|
rv = db.tt.create_index('idx_aa', db.tt.aa)
|
||
|
self.assertTrue(rv)
|
||
|
rv = db.tt.drop_index('idx_aa')
|
||
|
self.assertTrue(rv)
|
||
|
with self.assertRaises(Exception):
|
||
|
db.tt.drop_index('idx_aa')
|
||
|
db.rollback()
|
||
|
drop(db.tt)
|
||
|
|
||
|
|
||
|
@unittest.skipUnless(IS_POSTGRESQL, 'Expressions in indexes are not supported')
|
||
|
class TestIndexesExpressions(unittest.TestCase):
|
||
|
def testRun(self):
|
||
|
db = DAL(DEFAULT_URI, check_reserved=['all'], entity_quoting=True)
|
||
|
db.define_table('tt', Field('aa'), Field('bb', 'datetime'))
|
||
|
sql = db._adapter.dialect.create_index(
|
||
|
'idx_aa_and_bb', db.tt, [db.tt.aa, db.tt.bb.coalesce(None)]
|
||
|
)
|
||
|
with db._adapter.index_expander():
|
||
|
coalesce_sql = str(db.tt.bb.coalesce(None))
|
||
|
expected_sql = 'CREATE INDEX %s ON %s (%s,%s);' % (
|
||
|
db._adapter.dialect.quote('idx_aa_and_bb'), db.tt.sql_shortref,
|
||
|
db.tt.aa.sqlsafe_name, coalesce_sql)
|
||
|
self.assertEqual(sql, expected_sql)
|
||
|
rv = db.tt.create_index(
|
||
|
'idx_aa_and_bb', db.tt.aa, db.tt.bb.coalesce(None))
|
||
|
self.assertTrue(rv)
|
||
|
rv = db.tt.drop_index('idx_aa_and_bb')
|
||
|
self.assertTrue(rv)
|
||
|
drop(db.tt)
|
||
|
|
||
|
|
||
|
@unittest.skipUnless(IS_POSTGRESQL, 'Partial indexes are not supported')
|
||
|
class TestIndexesWhere(unittest.TestCase):
|
||
|
def testRun(self):
|
||
|
db = DAL(DEFAULT_URI, check_reserved=['all'], entity_quoting=True)
|
||
|
db.define_table('tt', Field('aa'), Field('bb', 'boolean'))
|
||
|
sql = db._adapter.dialect.create_index(
|
||
|
'idx_aa_f', db.tt, [db.tt.aa], where=str(db.tt.bb == False)
|
||
|
)
|
||
|
self.assertEqual(
|
||
|
sql,
|
||
|
'CREATE INDEX "idx_aa_f" ON "tt" ("aa") WHERE ("tt"."bb" = \'F\');'
|
||
|
)
|
||
|
rv = db.tt.create_index(
|
||
|
'idx_aa_f', db.tt.aa, where=(db.tt.bb == False))
|
||
|
self.assertTrue(rv)
|
||
|
rv = db.tt.drop_index('idx_aa_f')
|
||
|
self.assertTrue(rv)
|
||
|
drop(db.tt)
|