Skip to content

Commit

Permalink
feat: udate parameter using find by query
Browse files Browse the repository at this point in the history
Signed-off-by: Otavio Santana <otaviopolianasantana@gmail.com>
  • Loading branch information
otaviojava committed Apr 11, 2024
1 parent da60037 commit d6d8053
Show file tree
Hide file tree
Showing 5 changed files with 81 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,9 @@
import jakarta.data.Sort;
import jakarta.data.page.PageRequest;
import jakarta.data.repository.Delete;
import jakarta.data.repository.Find;
import jakarta.data.repository.Insert;
import jakarta.data.repository.OrderBy;
import jakarta.data.repository.Query;
import jakarta.data.repository.Save;
import jakarta.data.repository.Update;
Expand Down Expand Up @@ -58,6 +60,8 @@ class MethodMetadata {
private final Delete delete;
private final Save save;
private final Query query;
private final Find find;
private final OrderBy[] orders;

private final DatabaseType type;

Expand All @@ -66,8 +70,8 @@ class MethodMetadata {
private final String entityType;

private MethodMetadata(String methodName, TypeElement returnElement, String returnType,
List<Parameter> parameters, DatabaseType type, String entityType,
Query query, Insert insert, Update update, Delete delete, Save save) {
List<Parameter> parameters, DatabaseType type, String entityType,
Query query, Insert insert, Update update, Delete delete, Save save, Find find, OrderBy[] orders) {

this.methodName = methodName;
this.returnElement = returnElement;
Expand All @@ -80,6 +84,8 @@ private MethodMetadata(String methodName, TypeElement returnElement, String retu
this.update = update;
this.delete = delete;
this.save = save;
this.find = find;
this.orders = orders;
}

public String getMethodName() {
Expand Down Expand Up @@ -149,10 +155,10 @@ public String getEntityType() {
return entityType;
}

public Optional<Parameter> findPageRequest(){
public Optional<Parameter> findPageRequest() {
for (Parameter parameter : this.parameters) {
TypeElement element = parameter.type();
if(PageRequest.class.getName().equals(element.getQualifiedName().toString())){
if (PageRequest.class.getName().equals(element.getQualifiedName().toString())) {
return Optional.of(parameter);
}
}
Expand All @@ -175,6 +181,14 @@ public boolean isSave() {
return Objects.nonNull(save);
}

public boolean isFind() {
return Objects.nonNull(find);
}

public OrderBy[] orders() {
return orders;
}

public static MethodMetadata of(Element element, String entityType, DatabaseType type, ProcessingEnvironment processingEnv) {
ElementKind kind = element.getKind();
if (ElementKind.METHOD.equals(kind) && !isDefaultMethod((ExecutableElement) element)) {
Expand All @@ -192,14 +206,16 @@ public static MethodMetadata of(Element element, String entityType, DatabaseType
Update update = method.getAnnotation(Update.class);
Delete delete = method.getAnnotation(Delete.class);
Save save = method.getAnnotation(Save.class);
Find find = method.getAnnotation(Find.class);
OrderBy[] orders = method.getAnnotationsByType(OrderBy.class);

return new MethodMetadata(methodName, returnElement, returnType, parameters, type, entityType, query,
insert, update, delete, save);
insert, update, delete, save, find, orders);
}
return null;
}

private static boolean isDefaultMethod(ExecutableElement methodElement) {
return methodElement.getModifiers().contains(Modifier.DEFAULT);
return methodElement.getModifiers().contains(Modifier.DEFAULT);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,28 +15,31 @@
package org.eclipse.jnosql.lite.mapping.repository;

enum MethodMetadataOperationType {
METHOD_QUERY, ANNOTATION_QUERY , EXIST_BY , COUNT_BY, DELETE_BY , NOT_SUPPORTED, INSERT , UPDATE, DELETE , SAVE;
METHOD_QUERY, ANNOTATION_QUERY, EXIST_BY, COUNT_BY, DELETE_BY, NOT_SUPPORTED, INSERT, UPDATE, DELETE, SAVE, PARAMETER_BASED;

static MethodMetadataOperationType of(MethodMetadata metadata) {
var methodName = metadata.getMethodName();
if (methodName.startsWith("findBy")) {

if (metadata.hasQuery()) {
return ANNOTATION_QUERY;
} else if (metadata.isInsert()) {
return INSERT;
} else if (metadata.isDelete()) {
return DELETE;
} else if (metadata.isUpdate()) {
return UPDATE;
} else if (metadata.isSave()) {
return SAVE;
} else if (metadata.isFind()) {
return PARAMETER_BASED;
} else if (methodName.startsWith("findBy")) {
return METHOD_QUERY;
} else if (methodName.startsWith("countBy")) {
return COUNT_BY;
} else if (methodName.startsWith("existsBy")) {
return EXIST_BY;
} else if (methodName.startsWith("deleteBy")) {
return DELETE_BY;
} else if (metadata.hasQuery()) {
return ANNOTATION_QUERY;
} else if(metadata.isInsert()){
return INSERT;
}else if(metadata.isDelete()){
return DELETE;
}else if(metadata.isUpdate()){
return UPDATE;
}else if(metadata.isSave()){
return SAVE;
}
return NOT_SUPPORTED;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,30 +14,36 @@
*/
package org.eclipse.jnosql.lite.mapping.repository;

import jakarta.data.repository.By;
import jakarta.data.repository.Param;

import javax.annotation.processing.ProcessingEnvironment;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement;
import javax.lang.model.type.ArrayType;
import javax.lang.model.type.DeclaredType;
import javax.lang.model.type.TypeKind;
import javax.lang.model.type.TypeMirror;
import java.util.List;
import java.util.Locale;

import static java.util.stream.Collectors.joining;

record Parameter(String name, Param param, TypeElement type, String genericType, String arrayType) {
record Parameter(String name, Param param, By by, TypeElement type, String genericType, String arrayType,
TypeKind kind) {

public boolean hasParam() {
return param != null;
}

public String parameterName() {
if(isGeneric()) {
return type.toString() + "<" +genericType+ "> " + name;
if (isGeneric()) {
return type.toString() + "<" + genericType + "> " + name;
}
if(isArray()) {
if (isArray()) {
return arrayType + " " + name;
} else if (kind.isPrimitive()) {
return kind.name().toLowerCase(Locale.ENGLISH) + " " + name;
}
return type.toString() + " " + name();
}
Expand All @@ -49,9 +55,11 @@ public boolean isGeneric() {
public boolean isArray() {
return arrayType != null;
}

public static Parameter of(VariableElement element, ProcessingEnvironment processingEnv) {
String name = element.getSimpleName().toString();
Param param = element.getAnnotation(Param.class);
By by = element.getAnnotation(By.class);
TypeMirror typeMirror = element.asType();
String arrayType = null;
String genericType = null;
Expand All @@ -62,10 +70,10 @@ public static Parameter of(VariableElement element, ProcessingEnvironment proces
if (typeMirror instanceof ArrayType) {
arrayType = typeMirror.toString();
}

TypeElement type = (TypeElement) processingEnv.getTypeUtils().asElement(typeMirror);
return new Parameter(name, param, type, genericType, arrayType);
return new Parameter(name, param, by, type, genericType, arrayType, typeMirror.getKind());
}



}
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ class SemiStructureMethodGenerator implements MethodGenerator {

@Override
public List<String> getLines() {
var methodBuilder = SemistructuredMethodBuilder.of(this.metadata);
var methodBuilder = SemiStructuredMethodBuilder.of(this.metadata);
return methodBuilder.apply(this.metadata);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
*/
package org.eclipse.jnosql.lite.mapping.repository;

import jakarta.data.repository.By;
import jakarta.data.repository.OrderBy;
import jakarta.data.repository.Param;
import jakarta.data.repository.Query;

Expand All @@ -22,7 +24,7 @@
import java.util.List;
import java.util.function.Function;

enum SemistructuredMethodBuilder implements Function<MethodMetadata, List<String>> {
enum SemiStructuredMethodBuilder implements Function<MethodMetadata, List<String>> {

METHOD_QUERY {
@Override
Expand Down Expand Up @@ -113,6 +115,30 @@ public List<String> apply(MethodMetadata methodMetadata) {
public List<String> apply(MethodMetadata methodMetadata) {
return AnnotationOperationMethodBuilder.SAVE.apply(methodMetadata);
}
}, PARAMETER_BASED {
@Override
public List<String> apply(MethodMetadata metadata) {
List<String> lines = new ArrayList<>();
lines.add("java.util.Map<String, Object> parametersJNoSQL = new java.util.HashMap<>()");
for (Parameter parameter : metadata.getParameters()) {
By by = parameter.by();
if(by != null) {
lines.add("parametersJNoSQL.put(\"" + by.value() + "\", " + parameter.name() + ")");
}
}
lines.add("java.util.List<Sort<?>> sortsJNoSQL = new java.util.ArrayList<>()");
for (OrderBy order : metadata.orders()) {
if(order.descending()){
lines.add("sortsJNoSQL.add(jakarta.data.Sort.desc(\"" + order.value() + "\"))");
} else {
lines.add("sortsJNoSQL.add(jakarta.data.Sort.asc(\"" + order.value() + "\"))");
}
}
lines.add("var query = org.eclipse.jnosql.mapping.semistructured.query.SemiStructuredParameterBasedQuery.INSTANCE.toQuery(parametersJNoSQL, sortsJNoSQL, entityMetadata())");
MethodQueryRepositoryReturnType returnType = MethodQueryRepositoryReturnType.of(metadata);
lines.addAll(returnType.apply(metadata));
return lines;
}
};

private static final String SPACE = "\n ";
Expand Down Expand Up @@ -140,9 +166,9 @@ private static void feedSelectQuery(MethodMetadata metadata, List<String> lines)
}
}

static SemistructuredMethodBuilder of(MethodMetadata metadata) {
static SemiStructuredMethodBuilder of(MethodMetadata metadata) {
MethodMetadataOperationType operationType = MethodMetadataOperationType.of(metadata);
return Arrays.stream(SemistructuredMethodBuilder.values()).filter(c -> c.name().equals(operationType.name()))
return Arrays.stream(SemiStructuredMethodBuilder.values()).filter(c -> c.name().equals(operationType.name()))
.findAny().orElse(NOT_SUPPORTED);
}
}

0 comments on commit d6d8053

Please sign in to comment.