From 5de9629aab8fcfed26e3383933de9622a8cd2969 Mon Sep 17 00:00:00 2001 From: florent champigny Date: Fri, 5 Feb 2016 13:01:27 +0100 Subject: [PATCH 1/7] updated README --- README.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/README.md b/README.md index f0100bf..1bbee31 100644 --- a/README.md +++ b/README.md @@ -141,6 +141,19 @@ public class MyEntity { } ``` +#Ignore + +You can ignore a field: + +```java +@Model +public class MyEntity { + @Ignore + int field; +} +``` + + #Logging You can log all SQL queries from entities managers: @@ -229,6 +242,10 @@ Introduced Migration Engine. - Added unit tests - Fixed one to many +##1.0.4 + +- @Ignore + #A project initiated by Xebia This project was first developed by Xebia and has been open-sourced since. We will continue working on it. From bd1e9b7d219ad6cc9aac44704fd531d5af813105 Mon Sep 17 00:00:00 2001 From: florent champigny Date: Fri, 5 Feb 2016 13:13:09 +0100 Subject: [PATCH 2/7] updated README --- README.md | 3 --- .../generator/QueryBuilderGenerator.java | 19 +++++++++++++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 1bbee31..10201fb 100644 --- a/README.md +++ b/README.md @@ -217,11 +217,8 @@ Migration isn't yet capable of: - Update an entry - Improve migration -- Add some selectors operations (like, ...) - Add Observable support - Provide an Asynchronous API -- Add `@Ignore` annotation -- Add unit tests #Changelog diff --git a/freezer-compiler/src/main/java/fr/xebia/android/freezer/generator/QueryBuilderGenerator.java b/freezer-compiler/src/main/java/fr/xebia/android/freezer/generator/QueryBuilderGenerator.java index 548cac5..a9072d1 100644 --- a/freezer-compiler/src/main/java/fr/xebia/android/freezer/generator/QueryBuilderGenerator.java +++ b/freezer-compiler/src/main/java/fr/xebia/android/freezer/generator/QueryBuilderGenerator.java @@ -275,6 +275,14 @@ protected List generateSelectors() { .addStatement("return queryBuilder") .build()) + .addMethod(MethodSpec.methodBuilder("like") + .addModifiers(Modifier.PUBLIC) + .returns(TypeVariableName.get("Q2")) + .addParameter(TypeName.get(String.class), "value") + .addStatement("queryBuilder.appendQuery(column+\" LIKE '\"+value+\"'\",null)") + .addStatement("return queryBuilder") + .build()) + .build()); typeSpecs.add(TypeSpec.classBuilder(Constants.SELECTOR_STRING_LIST) @@ -405,6 +413,17 @@ protected List generateSelectors() { .addStatement("return queryBuilder") .build()) + .addMethod(MethodSpec.methodBuilder("between") + .addModifiers(Modifier.PUBLIC) + .returns(TypeVariableName.get("Q3")) + .addParameter(Constants.dateClassName, "min") + .addParameter(Constants.dateClassName, "max") + .addStatement("queryBuilder.appendQuery(column+\" > Datetime(?)\", new $T($S).format(min))", Constants.simpleDateFormatClassName, Constants.DATE_FORMAT) + .addStatement("queryBuilder.appendAnd()") + .addStatement("queryBuilder.appendQuery(column+\" < Datetime(?)\", new $T($S).format(max))", Constants.simpleDateFormatClassName, Constants.DATE_FORMAT) + .addStatement("return queryBuilder") + .build()) + .build()); return typeSpecs; From 05aaba175bd93cc38a530898aec7adcc7bb5ad39 Mon Sep 17 00:00:00 2001 From: florent champigny Date: Fri, 5 Feb 2016 13:22:05 +0100 Subject: [PATCH 3/7] Processor is called when added an @Ignore --- .../src/main/java/fr/xebia/android/freezer/Processor.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/freezer-compiler/src/main/java/fr/xebia/android/freezer/Processor.java b/freezer-compiler/src/main/java/fr/xebia/android/freezer/Processor.java index 00e0e76..28753bc 100644 --- a/freezer-compiler/src/main/java/fr/xebia/android/freezer/Processor.java +++ b/freezer-compiler/src/main/java/fr/xebia/android/freezer/Processor.java @@ -39,7 +39,11 @@ */ @SupportedSourceVersion(SourceVersion.RELEASE_7) @SupportedAnnotationTypes( - {"fr.xebia.android.freezer.annotations.Model", "fr.xebia.android.freezer.annotations.Migration"}) + { + "fr.xebia.android.freezer.annotations.Model", + "fr.xebia.android.freezer.annotations.Migration", + "fr.xebia.android.freezer.annotations.Ignore" + }) @AutoService(javax.annotation.processing.Processor.class) public class Processor extends AbstractProcessor { From 92064922bc6cae387a0db1f3c286edcd9a52f199 Mon Sep 17 00:00:00 2001 From: florent champigny Date: Mon, 8 Feb 2016 14:03:44 +0100 Subject: [PATCH 4/7] added @Id --- .../com/github/florent37/orm/model/Cat.java | 11 +++++- .../florent37/dao/CatEntityManagerTest.java | 1 + .../xebia/android/freezer/annotations/Id.java | 14 +++++++ .../xebia/android/freezer/ProcessUtils.java | 16 ++++++++ .../generator/CursorHelperGenerator.java | 8 +++- .../generator/ModelEntityProxyGenerator.java | 37 ++++++++++++------- 6 files changed, 71 insertions(+), 16 deletions(-) create mode 100644 freezer-annotations/src/main/java/fr/xebia/android/freezer/annotations/Id.java diff --git a/app/src/main/java/com/github/florent37/orm/model/Cat.java b/app/src/main/java/com/github/florent37/orm/model/Cat.java index 70dd5d2..32464e2 100644 --- a/app/src/main/java/com/github/florent37/orm/model/Cat.java +++ b/app/src/main/java/com/github/florent37/orm/model/Cat.java @@ -1,5 +1,6 @@ package com.github.florent37.orm.model; +import fr.xebia.android.freezer.annotations.Id; import fr.xebia.android.freezer.annotations.Ignore; import fr.xebia.android.freezer.annotations.Model; @@ -12,11 +13,15 @@ @Model public class Cat { + @Id + long id; + String shortName; Date date; String notIgnored; - @Ignore String ignoreThis; + @Ignore + String ignoreThis; public Cat() { } @@ -37,4 +42,8 @@ public String getShortName() { public Date getDate() { return date; } + + public long getId() { + return id; + } } diff --git a/app/src/test/java/com/github/florent37/dao/CatEntityManagerTest.java b/app/src/test/java/com/github/florent37/dao/CatEntityManagerTest.java index e921603..4ee24c0 100644 --- a/app/src/test/java/com/github/florent37/dao/CatEntityManagerTest.java +++ b/app/src/test/java/com/github/florent37/dao/CatEntityManagerTest.java @@ -43,6 +43,7 @@ public void shouldAddCatWithDate(){ //then assertThat(catEntityManager.count()).isEqualTo(1); + assertThat(cat.getId()).isNotEqualTo(0); } @Test diff --git a/freezer-annotations/src/main/java/fr/xebia/android/freezer/annotations/Id.java b/freezer-annotations/src/main/java/fr/xebia/android/freezer/annotations/Id.java new file mode 100644 index 0000000..4c26548 --- /dev/null +++ b/freezer-annotations/src/main/java/fr/xebia/android/freezer/annotations/Id.java @@ -0,0 +1,14 @@ +package fr.xebia.android.freezer.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Created by florentchampigny on 07/01/2016. + */ +@Retention(RetentionPolicy.SOURCE) +@Target(ElementType.FIELD) +public @interface Id { +} diff --git a/freezer-compiler/src/main/java/fr/xebia/android/freezer/ProcessUtils.java b/freezer-compiler/src/main/java/fr/xebia/android/freezer/ProcessUtils.java index f9e5ff1..991b149 100644 --- a/freezer-compiler/src/main/java/fr/xebia/android/freezer/ProcessUtils.java +++ b/freezer-compiler/src/main/java/fr/xebia/android/freezer/ProcessUtils.java @@ -14,6 +14,7 @@ import javax.lang.model.element.VariableElement; import javax.lang.model.util.ElementFilter; +import fr.xebia.android.freezer.annotations.Id; import fr.xebia.android.freezer.annotations.Ignore; /** @@ -61,6 +62,17 @@ public static List getNonPrimitiveClassFields(Element element) return filterIgnore(nonPrimitive); } + public static boolean hasIdField(Element element){ + return getIdField(element) != null; + } + + public static Element getIdField(Element element){ + for (VariableElement e : getFields(element)) { + if (isIdField(e)) return e; + } + return null; + } + public static String getFieldType(VariableElement variableElement) { TypeName typeName = getFieldClass(variableElement); if (typeName == TypeName.INT || typeName == TypeName.BOOLEAN || typeName == TypeName.BYTE) @@ -98,6 +110,10 @@ public static String getObjectName(Element element) { return element.getSimpleName().toString(); } + public static boolean isIdField(Element element) { + return element.getAnnotation(Id.class) != null && TypeName.LONG.equals(TypeName.get(element.asType())); + } + public static String getObjectPackage(Element element) { return element.getEnclosingElement().toString(); } diff --git a/freezer-compiler/src/main/java/fr/xebia/android/freezer/generator/CursorHelperGenerator.java b/freezer-compiler/src/main/java/fr/xebia/android/freezer/generator/CursorHelperGenerator.java index 2c5a04d..03dfadc 100644 --- a/freezer-compiler/src/main/java/fr/xebia/android/freezer/generator/CursorHelperGenerator.java +++ b/freezer-compiler/src/main/java/fr/xebia/android/freezer/generator/CursorHelperGenerator.java @@ -64,7 +64,7 @@ public TypeSpec generate() { .addStatement("if(date$L != null) object.$L = new $T($S).parse(date$L)", i, variableElement.getSimpleName(), Constants.simpleDateFormatClassName, Constants.DATE_FORMAT, i) .addCode("} catch ($T e) { e.printStackTrace(); }", TypeName.get(Exception.class)); - } else { + } else if (!ProcessUtils.isIdField(variableElement)){ cursor = String.format(ProcessUtils.getFieldCast(variableElement), cursor); fromCursorB.addStatement("object.$L = " + cursor, variableElement.getSimpleName(), ProcessUtils.getFieldType(variableElement), variableElement.getSimpleName()); @@ -110,7 +110,7 @@ public TypeSpec generate() { if (ProcessUtils.isPrimitive(variableElement)) { if (ProcessUtils.isDate(variableElement)) { getValuesB.addStatement("if(object.$L != null) values.put($S, new $T($S).format(object.$L))", variableElement.getSimpleName(), variableElement.getSimpleName(), Constants.simpleDateFormatClassName, Constants.DATE_FORMAT, variableElement.getSimpleName()); - } else { + } else if(!ProcessUtils.isIdField(variableElement)) { String statement = "values.put($S,object.$L)"; if (ProcessUtils.isModelId(variableElement)) statement = "if(" + ProcessUtils.getCursorHelperName("object") + " != 0) " + statement; @@ -177,6 +177,10 @@ protected List generateInsertMethods() { .addParameter(modelType, "object") .addStatement("long objectId = database.insert($S, null, getValues(object,null))", ProcessUtils.getTableName(objectName)); + Element idField = ProcessUtils.getIdField(element); + if(idField != null) + insertB.addStatement("object.$L = objectId",ProcessUtils.getObjectName(idField)); + for (VariableElement variableElement : otherClassFields) { insertB.addStatement("$T.insertFor$L(database,object.$L, objectId , $S)", ProcessUtils.getFieldCursorHelperClass(variableElement), objectName, ProcessUtils.getObjectName(variableElement), ProcessUtils.getObjectName(variableElement)); diff --git a/freezer-compiler/src/main/java/fr/xebia/android/freezer/generator/ModelEntityProxyGenerator.java b/freezer-compiler/src/main/java/fr/xebia/android/freezer/generator/ModelEntityProxyGenerator.java index c38025f..9ce234d 100644 --- a/freezer-compiler/src/main/java/fr/xebia/android/freezer/generator/ModelEntityProxyGenerator.java +++ b/freezer-compiler/src/main/java/fr/xebia/android/freezer/generator/ModelEntityProxyGenerator.java @@ -4,12 +4,13 @@ import com.squareup.javapoet.MethodSpec; import com.squareup.javapoet.TypeName; import com.squareup.javapoet.TypeSpec; -import fr.xebia.android.freezer.Constants; -import fr.xebia.android.freezer.ProcessUtils; import javax.lang.model.element.Element; import javax.lang.model.element.Modifier; +import fr.xebia.android.freezer.Constants; +import fr.xebia.android.freezer.ProcessUtils; + /** * Created by florentchampigny on 26/01/2016. */ @@ -37,23 +38,33 @@ public static TypeSpec generateModelProxyInterface() { } public TypeSpec generate() { - return TypeSpec.classBuilder(ProcessUtils.getObjectName(element) + Constants.MODEL_ENTITY_PROXY) + String idFieldName = Constants.FIELD_ID; + Element idField = ProcessUtils.getIdField(element); + if (idField != null) + idFieldName = ProcessUtils.getObjectName(idField); + + TypeSpec.Builder builder = TypeSpec.classBuilder(ProcessUtils.getObjectName(element) + Constants.MODEL_ENTITY_PROXY) .addModifiers(Modifier.PUBLIC) .superclass(TypeName.get(element.asType())) - .addSuperinterface(ClassName.get(Constants.DAO_PACKAGE, Constants.MODEL_ENTITY_PROXY_INTERFACE)) - .addField(TypeName.LONG, Constants.FIELD_ID) - .addMethod(MethodSpec.methodBuilder(Constants.MODEL_ENTITY_PROXY_GET_ID_METHOD) - .addModifiers(Modifier.PUBLIC) - .returns(TypeName.LONG) - .addStatement("return $L", Constants.FIELD_ID) - .build()) + .addSuperinterface(ClassName.get(Constants.DAO_PACKAGE, Constants.MODEL_ENTITY_PROXY_INTERFACE)); + + if (idField == null) { + builder.addField(TypeName.LONG, Constants.FIELD_ID); + } + + builder.addMethod(MethodSpec.methodBuilder(Constants.MODEL_ENTITY_PROXY_GET_ID_METHOD) + .addModifiers(Modifier.PUBLIC) + .returns(TypeName.LONG) + .addStatement("return $L", idFieldName) + .build()) .addMethod(MethodSpec.methodBuilder(Constants.MODEL_ENTITY_PROXY_SET_ID_METHOD) .addModifiers(Modifier.PUBLIC) .returns(TypeName.VOID) .addParameter(TypeName.LONG, "id") - .addStatement("this.$L = id", Constants.FIELD_ID) - .build()) - .build(); + .addStatement("this.$L = id", idFieldName) + .build()); + + return builder.build(); } } From 147dd4950565ab7c2fb67a38697aedbca37552ad Mon Sep 17 00:00:00 2001 From: florent champigny Date: Mon, 8 Feb 2016 14:29:39 +0100 Subject: [PATCH 5/7] mapped object id with _id sql column --- .../fr/xebia/android/freezer/ProcessUtils.java | 3 ++- .../freezer/generator/EnumColumnGenerator.java | 10 +++++++--- .../freezer/generator/ModelORMGenerator.java | 17 +++++++++++++---- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/freezer-compiler/src/main/java/fr/xebia/android/freezer/ProcessUtils.java b/freezer-compiler/src/main/java/fr/xebia/android/freezer/ProcessUtils.java index 991b149..98495a8 100644 --- a/freezer-compiler/src/main/java/fr/xebia/android/freezer/ProcessUtils.java +++ b/freezer-compiler/src/main/java/fr/xebia/android/freezer/ProcessUtils.java @@ -95,7 +95,7 @@ public static String getFieldCast(VariableElement variableElement) { return "%s"; } - public static String getFieldTableType(VariableElement variableElement) { + public static String getFieldTableType(Element variableElement) { TypeName typeName = getFieldClass(variableElement); if (typeName == TypeName.INT || typeName == TypeName.BOOLEAN || typeName == TypeName.LONG || typeName == TypeName.BYTE) return "integer"; @@ -417,4 +417,5 @@ public static boolean isDate(Element element) { public static boolean isDate(TypeName typeName) { return Constants.dateClassName.equals(typeName); } + } diff --git a/freezer-compiler/src/main/java/fr/xebia/android/freezer/generator/EnumColumnGenerator.java b/freezer-compiler/src/main/java/fr/xebia/android/freezer/generator/EnumColumnGenerator.java index 301b49a..c87029f 100644 --- a/freezer-compiler/src/main/java/fr/xebia/android/freezer/generator/EnumColumnGenerator.java +++ b/freezer-compiler/src/main/java/fr/xebia/android/freezer/generator/EnumColumnGenerator.java @@ -3,8 +3,6 @@ import com.squareup.javapoet.MethodSpec; import com.squareup.javapoet.TypeName; import com.squareup.javapoet.TypeSpec; -import fr.xebia.android.freezer.Constants; -import fr.xebia.android.freezer.ProcessUtils; import java.util.List; @@ -12,6 +10,9 @@ import javax.lang.model.element.Modifier; import javax.lang.model.element.VariableElement; +import fr.xebia.android.freezer.Constants; +import fr.xebia.android.freezer.ProcessUtils; + /** * Created by florentchampigny on 22/01/2016. */ @@ -40,7 +41,10 @@ public TypeSpec generate() { .build()); for (VariableElement variableElement : fields) { - enumBuilder.addEnumConstant(ProcessUtils.getObjectName(variableElement), TypeSpec.anonymousClassBuilder("$S", ProcessUtils.getObjectName(variableElement)) + String fieldSqlName = ProcessUtils.getObjectName(variableElement); + if (ProcessUtils.isIdField(variableElement)) + fieldSqlName = Constants.FIELD_ID; + enumBuilder.addEnumConstant(ProcessUtils.getObjectName(variableElement), TypeSpec.anonymousClassBuilder("$S", fieldSqlName) .build()); } diff --git a/freezer-compiler/src/main/java/fr/xebia/android/freezer/generator/ModelORMGenerator.java b/freezer-compiler/src/main/java/fr/xebia/android/freezer/generator/ModelORMGenerator.java index 6936f35..49c7523 100644 --- a/freezer-compiler/src/main/java/fr/xebia/android/freezer/generator/ModelORMGenerator.java +++ b/freezer-compiler/src/main/java/fr/xebia/android/freezer/generator/ModelORMGenerator.java @@ -39,6 +39,7 @@ public class ModelORMGenerator { TypeSpec queryBuilder; TypeSpec dao; + Element fieldId; List fields; List otherClassFields; List collections; @@ -58,6 +59,8 @@ public ModelORMGenerator(Element element) { this.fields = ProcessUtils.getPrimitiveFields(element); this.otherClassFields = ProcessUtils.getNonPrimitiveClassFields(element); this.collections = ProcessUtils.getCollectionsOfPrimitiveFields(element); + + this.fieldId = ProcessUtils.getIdField(element); } public TypeSpec getDao() { @@ -369,7 +372,6 @@ protected List generateQueryMethods() { else selector = ParameterizedTypeName.get(className, queryBuilderClassName); - methodSpecs.add(MethodSpec.methodBuilder(variableElement.getSimpleName().toString()) .returns(selector) .addModifiers(Modifier.PUBLIC) @@ -444,14 +446,21 @@ protected String generateCreationString() { protected String generateTableCreate() { StringBuilder stringBuilder = new StringBuilder(); - for (int i = 0; i < fields.size(); ++i) { - VariableElement variableElement = fields.get(i); + + //filter / remove fieldId + List elements = new ArrayList<>(); + for (VariableElement variableElement : fields) + if (variableElement != fieldId) + elements.add(variableElement); + + for (int i = 0; i < elements.size(); ++i) { + Element variableElement = elements.get(i); if (!Constants.FIELD_ID.equals(variableElement.getSimpleName().toString())) { stringBuilder .append(variableElement.getSimpleName()) .append(" ") .append(ProcessUtils.getFieldTableType(variableElement)); - if (i < fields.size() - 1) + if (i < elements.size() - 1) stringBuilder.append(", "); } } From 5c4e6bfb9b336cc4c791db22706e3223a1aea502 Mon Sep 17 00:00:00 2001 From: florent champigny Date: Mon, 8 Feb 2016 15:45:18 +0100 Subject: [PATCH 6/7] updated README --- README.md | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 10201fb..e84842e 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,7 @@ public class Dog { ```java @Model public class Cat { + @Id long id; String shortName; } ``` @@ -141,6 +142,18 @@ public class MyEntity { } ``` +#Id + +You can optionnaly set a field as an identifier: + +```java +@Model +public class MyEntity { + @Id long id; +} +``` +The identifier must be a `long + #Ignore You can ignore a field: @@ -241,7 +254,7 @@ Introduced Migration Engine. ##1.0.4 -- @Ignore +- Added @Id & @Ignore #A project initiated by Xebia @@ -263,9 +276,9 @@ buildscript { apply plugin: 'com.neenbedankt.android-apt' dependencies { - compile 'fr.xebia.android.freezer:freezer:1.0.3' - provided 'fr.xebia.android.freezer:freezer-annotations:1.0.3' - apt 'fr.xebia.android.freezer:freezer-compiler:1.0.3' + compile 'fr.xebia.android.freezer:freezer:1.0.4' + provided 'fr.xebia.android.freezer:freezer-annotations:1.0.4' + apt 'fr.xebia.android.freezer:freezer-compiler:1.0.4' } ``` From 1d0ef2ebdfd2beb9229fb3c6ea22e84f4bff6532 Mon Sep 17 00:00:00 2001 From: florent champigny Date: Mon, 8 Feb 2016 15:50:17 +0100 Subject: [PATCH 7/7] v1.0.4 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index abaf577..b0a10fd 100644 --- a/build.gradle +++ b/build.gradle @@ -23,7 +23,7 @@ ext{ sourceCompatibilityVersion = JavaVersion.VERSION_1_7 targetCompatibilityVersion = JavaVersion.VERSION_1_7 - libraryVersion="1.0.3" + libraryVersion="1.0.4" } allprojects {