diff --git a/src/nl/astraeus/database/DdlMapping.java b/src/nl/astraeus/database/DdlMapping.java index 91692fc..3591cd4 100644 --- a/src/nl/astraeus/database/DdlMapping.java +++ b/src/nl/astraeus/database/DdlMapping.java @@ -21,6 +21,7 @@ public static enum QueryTemplates { CREATE, CREATE_COLUMN, + CREATE_INDEX, INSERT, UPDATE, DELETE, @@ -140,6 +141,7 @@ queryTemplates.put(QueryTemplates.CREATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("create.sql"))); queryTemplates.put(QueryTemplates.CREATE_COLUMN, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createColumn.sql"))); + queryTemplates.put(QueryTemplates.CREATE_INDEX, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createIndex.sql"))); queryTemplates.put(QueryTemplates.INSERT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("insert.sql"))); queryTemplates.put(QueryTemplates.UPDATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("update.sql"))); queryTemplates.put(QueryTemplates.DELETE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("delete.sql"))); diff --git a/src/nl/astraeus/database/DdlMapping.java b/src/nl/astraeus/database/DdlMapping.java index 91692fc..3591cd4 100644 --- a/src/nl/astraeus/database/DdlMapping.java +++ b/src/nl/astraeus/database/DdlMapping.java @@ -21,6 +21,7 @@ public static enum QueryTemplates { CREATE, CREATE_COLUMN, + CREATE_INDEX, INSERT, UPDATE, DELETE, @@ -140,6 +141,7 @@ queryTemplates.put(QueryTemplates.CREATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("create.sql"))); queryTemplates.put(QueryTemplates.CREATE_COLUMN, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createColumn.sql"))); + queryTemplates.put(QueryTemplates.CREATE_INDEX, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createIndex.sql"))); queryTemplates.put(QueryTemplates.INSERT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("insert.sql"))); queryTemplates.put(QueryTemplates.UPDATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("update.sql"))); queryTemplates.put(QueryTemplates.DELETE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("delete.sql"))); diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index e0af326..78ab37a 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -43,6 +43,7 @@ private Reference reference; private Length length; private Default defaultValue; + private Index index; private Class collectionClass; private boolean primaryKey = false; @@ -80,6 +81,7 @@ reference = field.getAnnotation(Reference.class); length = field.getAnnotation(Length.class); defaultValue = field.getAnnotation(Default.class); + index = field.getAnnotation(Index.class); Column column = field.getAnnotation(Column.class); Id id = field.getAnnotation(Id.class); @@ -180,6 +182,14 @@ return length; } + public boolean hasIndex() { + return index != null; + } + + public boolean hasUniqueIndex() { + return index != null && index.unique(); + } + public Default getDefaultValue() { return defaultValue; } diff --git a/src/nl/astraeus/database/DdlMapping.java b/src/nl/astraeus/database/DdlMapping.java index 91692fc..3591cd4 100644 --- a/src/nl/astraeus/database/DdlMapping.java +++ b/src/nl/astraeus/database/DdlMapping.java @@ -21,6 +21,7 @@ public static enum QueryTemplates { CREATE, CREATE_COLUMN, + CREATE_INDEX, INSERT, UPDATE, DELETE, @@ -140,6 +141,7 @@ queryTemplates.put(QueryTemplates.CREATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("create.sql"))); queryTemplates.put(QueryTemplates.CREATE_COLUMN, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createColumn.sql"))); + queryTemplates.put(QueryTemplates.CREATE_INDEX, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createIndex.sql"))); queryTemplates.put(QueryTemplates.INSERT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("insert.sql"))); queryTemplates.put(QueryTemplates.UPDATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("update.sql"))); queryTemplates.put(QueryTemplates.DELETE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("delete.sql"))); diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index e0af326..78ab37a 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -43,6 +43,7 @@ private Reference reference; private Length length; private Default defaultValue; + private Index index; private Class collectionClass; private boolean primaryKey = false; @@ -80,6 +81,7 @@ reference = field.getAnnotation(Reference.class); length = field.getAnnotation(Length.class); defaultValue = field.getAnnotation(Default.class); + index = field.getAnnotation(Index.class); Column column = field.getAnnotation(Column.class); Id id = field.getAnnotation(Id.class); @@ -180,6 +182,14 @@ return length; } + public boolean hasIndex() { + return index != null; + } + + public boolean hasUniqueIndex() { + return index != null && index.unique(); + } + public Default getDefaultValue() { return defaultValue; } diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index 75ff015..27abf01 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -93,6 +93,9 @@ } // check type etc // warn if different + if (meta.hasIndex()) { + createIndexes(meta); + } } else if (DdlMapping.get().isExecuteDdlUpdates()) { // create Column.... createColumn(meta); @@ -183,6 +186,18 @@ execute(template, model); } + private void createIndexes(FieldMetaData meta) { + Map model = new HashMap<>(); + + model.put("tableName", tableName); + model.put("column", meta.getColumnInfo()); + model.put("unique", meta.hasUniqueIndex()); + + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE_INDEX); + + execute(template, model); + } + private void execute(SimpleTemplate createTemplate, Map model) { Connection connection = null; PreparedStatement statement = null; diff --git a/src/nl/astraeus/database/DdlMapping.java b/src/nl/astraeus/database/DdlMapping.java index 91692fc..3591cd4 100644 --- a/src/nl/astraeus/database/DdlMapping.java +++ b/src/nl/astraeus/database/DdlMapping.java @@ -21,6 +21,7 @@ public static enum QueryTemplates { CREATE, CREATE_COLUMN, + CREATE_INDEX, INSERT, UPDATE, DELETE, @@ -140,6 +141,7 @@ queryTemplates.put(QueryTemplates.CREATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("create.sql"))); queryTemplates.put(QueryTemplates.CREATE_COLUMN, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createColumn.sql"))); + queryTemplates.put(QueryTemplates.CREATE_INDEX, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createIndex.sql"))); queryTemplates.put(QueryTemplates.INSERT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("insert.sql"))); queryTemplates.put(QueryTemplates.UPDATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("update.sql"))); queryTemplates.put(QueryTemplates.DELETE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("delete.sql"))); diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index e0af326..78ab37a 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -43,6 +43,7 @@ private Reference reference; private Length length; private Default defaultValue; + private Index index; private Class collectionClass; private boolean primaryKey = false; @@ -80,6 +81,7 @@ reference = field.getAnnotation(Reference.class); length = field.getAnnotation(Length.class); defaultValue = field.getAnnotation(Default.class); + index = field.getAnnotation(Index.class); Column column = field.getAnnotation(Column.class); Id id = field.getAnnotation(Id.class); @@ -180,6 +182,14 @@ return length; } + public boolean hasIndex() { + return index != null; + } + + public boolean hasUniqueIndex() { + return index != null && index.unique(); + } + public Default getDefaultValue() { return defaultValue; } diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index 75ff015..27abf01 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -93,6 +93,9 @@ } // check type etc // warn if different + if (meta.hasIndex()) { + createIndexes(meta); + } } else if (DdlMapping.get().isExecuteDdlUpdates()) { // create Column.... createColumn(meta); @@ -183,6 +186,18 @@ execute(template, model); } + private void createIndexes(FieldMetaData meta) { + Map model = new HashMap<>(); + + model.put("tableName", tableName); + model.put("column", meta.getColumnInfo()); + model.put("unique", meta.hasUniqueIndex()); + + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE_INDEX); + + execute(template, model); + } + private void execute(SimpleTemplate createTemplate, Map model) { Connection connection = null; PreparedStatement statement = null; diff --git a/src/nl/astraeus/database/annotations/Index.java b/src/nl/astraeus/database/annotations/Index.java new file mode 100644 index 0000000..c735eef --- /dev/null +++ b/src/nl/astraeus/database/annotations/Index.java @@ -0,0 +1,18 @@ +package nl.astraeus.database.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Date: 11/13/13 + * Time: 9:57 PM + */ +@Retention(RetentionPolicy.RUNTIME) +@Target( { ElementType.FIELD } ) +public @interface Index { + + boolean unique() default false; + +} diff --git a/src/nl/astraeus/database/DdlMapping.java b/src/nl/astraeus/database/DdlMapping.java index 91692fc..3591cd4 100644 --- a/src/nl/astraeus/database/DdlMapping.java +++ b/src/nl/astraeus/database/DdlMapping.java @@ -21,6 +21,7 @@ public static enum QueryTemplates { CREATE, CREATE_COLUMN, + CREATE_INDEX, INSERT, UPDATE, DELETE, @@ -140,6 +141,7 @@ queryTemplates.put(QueryTemplates.CREATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("create.sql"))); queryTemplates.put(QueryTemplates.CREATE_COLUMN, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createColumn.sql"))); + queryTemplates.put(QueryTemplates.CREATE_INDEX, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("createIndex.sql"))); queryTemplates.put(QueryTemplates.INSERT, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("insert.sql"))); queryTemplates.put(QueryTemplates.UPDATE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("update.sql"))); queryTemplates.put(QueryTemplates.DELETE, new SimpleTemplate("${", "}", EscapeMode.NONE, findSqlResource("delete.sql"))); diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index e0af326..78ab37a 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -43,6 +43,7 @@ private Reference reference; private Length length; private Default defaultValue; + private Index index; private Class collectionClass; private boolean primaryKey = false; @@ -80,6 +81,7 @@ reference = field.getAnnotation(Reference.class); length = field.getAnnotation(Length.class); defaultValue = field.getAnnotation(Default.class); + index = field.getAnnotation(Index.class); Column column = field.getAnnotation(Column.class); Id id = field.getAnnotation(Id.class); @@ -180,6 +182,14 @@ return length; } + public boolean hasIndex() { + return index != null; + } + + public boolean hasUniqueIndex() { + return index != null && index.unique(); + } + public Default getDefaultValue() { return defaultValue; } diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index 75ff015..27abf01 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -93,6 +93,9 @@ } // check type etc // warn if different + if (meta.hasIndex()) { + createIndexes(meta); + } } else if (DdlMapping.get().isExecuteDdlUpdates()) { // create Column.... createColumn(meta); @@ -183,6 +186,18 @@ execute(template, model); } + private void createIndexes(FieldMetaData meta) { + Map model = new HashMap<>(); + + model.put("tableName", tableName); + model.put("column", meta.getColumnInfo()); + model.put("unique", meta.hasUniqueIndex()); + + SimpleTemplate template = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.CREATE_INDEX); + + execute(template, model); + } + private void execute(SimpleTemplate createTemplate, Map model) { Connection connection = null; PreparedStatement statement = null; diff --git a/src/nl/astraeus/database/annotations/Index.java b/src/nl/astraeus/database/annotations/Index.java new file mode 100644 index 0000000..c735eef --- /dev/null +++ b/src/nl/astraeus/database/annotations/Index.java @@ -0,0 +1,18 @@ +package nl.astraeus.database.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Date: 11/13/13 + * Time: 9:57 PM + */ +@Retention(RetentionPolicy.RUNTIME) +@Target( { ElementType.FIELD } ) +public @interface Index { + + boolean unique() default false; + +} diff --git a/src/nl/astraeus/database/sql/def/createIndex.sql b/src/nl/astraeus/database/sql/def/createIndex.sql new file mode 100644 index 0000000..59d402a --- /dev/null +++ b/src/nl/astraeus/database/sql/def/createIndex.sql @@ -0,0 +1 @@ +create ${if(unique)}unique${/if} index IF NOT EXISTS IDX_${tableName}_${column.name} on ${tableName}(${column.name})