From a8b2e81c4cbf81fc51cea74de824365894069f8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Fri, 26 Aug 2022 10:42:03 +0200 Subject: [PATCH] Add ordering methods to query builder in DAO classes --- .../bartlomiejpluta/base/lib/db/Ordering.java | 13 ++++++ .../DataAccessObjectCodeGenerator.kt | 46 ++++++++++++++++++- 2 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 api/src/main/java/com/bartlomiejpluta/base/lib/db/Ordering.java diff --git a/api/src/main/java/com/bartlomiejpluta/base/lib/db/Ordering.java b/api/src/main/java/com/bartlomiejpluta/base/lib/db/Ordering.java new file mode 100644 index 00000000..38b7f3b7 --- /dev/null +++ b/api/src/main/java/com/bartlomiejpluta/base/lib/db/Ordering.java @@ -0,0 +1,13 @@ +package com.bartlomiejpluta.base.lib.db; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public enum Ordering { + ASC("ASC"), + DESC("DESC"); + + @Getter + private final String ordering; +} diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/generator/DataAccessObjectCodeGenerator.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/generator/DataAccessObjectCodeGenerator.kt index 3d01e393..b795fa7d 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/generator/DataAccessObjectCodeGenerator.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/generator/DataAccessObjectCodeGenerator.kt @@ -321,7 +321,18 @@ class DataAccessObjectCodeGenerator : CodeGenerator { Modifier.PRIVATE, Modifier.FINAL ) - .initializer("new \$T<>()", LinkedList::class.java).build() + .initializer("new \$T<>()", LinkedList::class.java) + .build() + ) + .addField( + FieldSpec.builder( + ParameterizedTypeName.get(ClassName.get(List::class.java), TypeName.get(String::class.java)), + "ordering", + Modifier.PRIVATE, + Modifier.FINAL + ) + .initializer("new \$T<>()", LinkedList::class.java) + .build() ) .addMethod( MethodSpec.methodBuilder("where") @@ -334,6 +345,35 @@ class DataAccessObjectCodeGenerator : CodeGenerator { .addStatement("return this") .build() ) + .addMethod( + MethodSpec.methodBuilder("orderBy") + .addModifiers(Modifier.PUBLIC) + .addParameter(COLUMN_ENUM, "column") + .addParameter(ORDERING_ENUM, "order") + .returns(QUERY_BUILDER_CLASS) + .addStatement("this.ordering.add(String.format(\"`%s %s\", column.column, order.getOrdering()))") + .addStatement("return this") + .build() + ) + .addMethod( + MethodSpec.methodBuilder("orderBy") + .addModifiers(Modifier.PUBLIC) + .addParameter(String::class.java, "function") + .addParameter(ORDERING_ENUM, "order") + .returns(QUERY_BUILDER_CLASS) + .addStatement("this.ordering.add(String.format(\"`%s %s\", function, order.getOrdering()))") + .addStatement("return this") + .build() + ) + .addMethod( + MethodSpec.methodBuilder("orderBy") + .addModifiers(Modifier.PUBLIC) + .addParameter(String::class.java, "function") + .returns(QUERY_BUILDER_CLASS) + .addStatement("this.ordering.add(function)") + .addStatement("return this") + .build() + ) .addMethod( MethodSpec.methodBuilder("find") .addModifiers(Modifier.PUBLIC) @@ -344,9 +384,10 @@ class DataAccessObjectCodeGenerator : CodeGenerator { "var filter = filters.stream().map(f -> String.format(\"`%s` %s ?\", f.column.column, f.op.getOp())).collect(\$T.joining(\" AND \"))", COLLECTORS_CLASS ) + .addStatement("var order = ordering.isEmpty() ? \"\" : \" ORDER BY \" + ordering.stream().collect(\$T.joining(\", \"))", COLLECTORS_CLASS) .apply { val sql = "SELECT * FROM `${table.name}` WHERE " - addStatement("var statement = db.prepareStatement(\"$sql\" + filter)") + addStatement("var statement = db.prepareStatement(\"$sql\" + filter + order)") } .addStatement("var i = 1") .beginControlFlow("for (var f : filters)") @@ -436,6 +477,7 @@ class DataAccessObjectCodeGenerator : CodeGenerator { private val COLUMN_ENUM = ClassName.get("", "Column") private val RELOP_ENUM = ClassName.get("com.bartlomiejpluta.base.lib.db", "Relop") + private val ORDERING_ENUM = ClassName.get("com.bartlomiejpluta.base.lib.db", "Ordering") private val QUERY_FILTER_CLASS = ClassName.get("", "QueryFilter") private val QUERY_BUILDER_CLASS = ClassName.get("", "QueryBuilder") private val COLLECTORS_CLASS = ClassName.get("java.util.stream", "Collectors")