summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRené 'Necoro' Neumann <necoro@necoro.net>2017-10-03 22:07:57 +0200
committerRené 'Necoro' Neumann <necoro@necoro.net>2017-10-03 22:07:57 +0200
commitcea032ecb83a589be94860f6045c55533237c529 (patch)
tree6fd65640d8e12d407c182af93d16e4f103ff2b94
parent90a209e69f455b49c4a642fb2b3288f915fed1dc (diff)
downloadarchivist-cea032ecb83a589be94860f6045c55533237c529.tar.gz
archivist-cea032ecb83a589be94860f6045c55533237c529.tar.bz2
archivist-cea032ecb83a589be94860f6045c55533237c529.zip
Unique index on tags as a functional one. See also:
https://github.com/coleifer/peewee/issues/1357
-rw-r--r--archivist/model.py6
-rw-r--r--archivist/peewee_ext.py17
2 files changed, 20 insertions, 3 deletions
diff --git a/archivist/model.py b/archivist/model.py
index f03927e..8aa8897 100644
--- a/archivist/model.py
+++ b/archivist/model.py
@@ -7,7 +7,7 @@ import datetime
from enum import Enum, unique
from pkg_resources import resource_filename
-from .peewee_ext import EnumField
+from .peewee_ext import EnumField, SQLIndex
from .peewee_fixes import * # dummy to force evaluation of those fixes
db = SqliteExtDatabase('test.db', pragmas=[('foreign_keys', 'ON')])
@@ -122,6 +122,7 @@ class Prefix(BaseModel):
@table
class Tag(BaseModel):
__keys__ = ('name', 'prefix')
+
name = CharField()
prefix = ForeignKeyField(Prefix, null=True, related_name = 'tag', db_column = 'prefix')
description = CharField(null=True)
@@ -140,7 +141,8 @@ class Tag(BaseModel):
class Meta:
indexes = [
- (('name', 'prefix'), True)
+ (('name', 'prefix'), False),
+ (('name', SQLIndex('coalescePrefix', "COALESCE(prefix,'')")), True)
]
@property
diff --git a/archivist/peewee_ext.py b/archivist/peewee_ext.py
index 40fe5e7..ff03861 100644
--- a/archivist/peewee_ext.py
+++ b/archivist/peewee_ext.py
@@ -1,4 +1,4 @@
-from peewee import Field
+from peewee import Field, SQL
from itertools import starmap
from functools import reduce
@@ -42,3 +42,18 @@ class EnumField(Field):
def python_value(self, value):
return value if value is None else self._enum_value(value)
+class SQLIndex(SQL):
+ """Ugly hack to allow arbitrary index creation."""
+ def __init__(self, field, sql):
+ self.field = field
+ super().__init__(sql)
+
+ def clone_base(self):
+ return SQLWithField(field, self.value)
+
+ @property
+ def db_column(self):
+ return self.field
+
+ def as_entity(self):
+ return self