diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index 77a9a944c..6236ba35b 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -13,6 +13,10 @@ and this project adheres to https://semver.org/spec/v2.0.0.html[Semantic Version - Update API using Apache Tinkerpop - Update package name of Graph to Tinkerpop +== Fixed + +- MongoDB conversions applied also to other databases + == [1.1.3] - 2024-10-24 === Added diff --git a/jnosql-arangodb/pom.xml b/jnosql-arangodb/pom.xml index 56533505d..d5a50da43 100644 --- a/jnosql-arangodb/pom.xml +++ b/jnosql-arangodb/pom.xml @@ -28,7 +28,7 @@ The Eclipse JNoSQL layer to ArangoDB - 7.13.0 + 7.15.0 diff --git a/jnosql-arangodb/src/main/java/org/eclipse/jnosql/databases/arangodb/communication/QueryAQLConverter.java b/jnosql-arangodb/src/main/java/org/eclipse/jnosql/databases/arangodb/communication/QueryAQLConverter.java index f1ea0e3b7..834b609a7 100644 --- a/jnosql-arangodb/src/main/java/org/eclipse/jnosql/databases/arangodb/communication/QueryAQLConverter.java +++ b/jnosql-arangodb/src/main/java/org/eclipse/jnosql/databases/arangodb/communication/QueryAQLConverter.java @@ -130,6 +130,7 @@ private static void definesCondition(CriteriaCondition condition, char entity, int counter) { Element document = condition.element(); + int localCounter = counter; switch (condition.condition()) { case IN: appendCondition(aql, params, entity, document, IN); @@ -157,27 +158,26 @@ private static void definesCondition(CriteriaCondition condition, for (CriteriaCondition dc : document.get(new TypeReference>() { })) { - if (isFirstCondition(aql, counter)) { + if (isFirstCondition(aql, localCounter)) { aql.append(AND); } - definesCondition(dc, aql, params, entity, ++counter); + definesCondition(dc, aql, params, entity, ++localCounter); } return; case OR: for (CriteriaCondition dc : document.get(new TypeReference>() { })) { - if (isFirstCondition(aql, counter)) { + if (isFirstCondition(aql, localCounter)) { aql.append(OR); } - definesCondition(dc, aql, params, entity, ++counter); + definesCondition(dc, aql, params, entity, ++localCounter); } return; case NOT: CriteriaCondition documentCondition = document.get(CriteriaCondition.class); - aql.append(NOT); - aql.append(START_EXPRESSION); - definesCondition(documentCondition, aql, params, entity, ++counter); + aql.append(NOT).append(START_EXPRESSION); + definesCondition(documentCondition, aql, params, entity, ++localCounter); aql.append(END_EXPRESSION); return; default: diff --git a/jnosql-mongodb/src/main/java/org/eclipse/jnosql/databases/mongodb/communication/DocumentQueryConversor.java b/jnosql-mongodb/src/main/java/org/eclipse/jnosql/databases/mongodb/communication/DocumentQueryConversor.java index 031e1760e..e64cbf787 100644 --- a/jnosql-mongodb/src/main/java/org/eclipse/jnosql/databases/mongodb/communication/DocumentQueryConversor.java +++ b/jnosql-mongodb/src/main/java/org/eclipse/jnosql/databases/mongodb/communication/DocumentQueryConversor.java @@ -34,7 +34,7 @@ private DocumentQueryConversor() { public static Bson convert(CriteriaCondition condition) { Element document = condition.element(); - Object value = ValueUtil.convert(document.value()); + Object value = ValueUtil.convert(document.value(), MongoDBValueWriteDecorator.MONGO_DB_VALUE_WRITER); return switch (condition.condition()) { case EQUALS -> Filters.eq(document.name(), value); case GREATER_THAN -> Filters.gt(document.name(), value); @@ -42,7 +42,7 @@ public static Bson convert(CriteriaCondition condition) { case LESSER_THAN -> Filters.lt(document.name(), value); case LESSER_EQUALS_THAN -> Filters.lte(document.name(), value); case IN -> { - List inList = ValueUtil.convertToList(document.value()); + List inList = ValueUtil.convertToList(document.value(), MongoDBValueWriteDecorator.MONGO_DB_VALUE_WRITER); yield Filters.in(document.name(), inList.toArray()); } case NOT -> { @@ -69,7 +69,7 @@ public static Bson convert(CriteriaCondition condition) { .map(DocumentQueryConversor::convert).toList()); } case BETWEEN -> { - List betweenList = ValueUtil.convertToList(document.value()); + List betweenList = ValueUtil.convertToList(document.value(), MongoDBValueWriteDecorator.MONGO_DB_VALUE_WRITER); yield Filters.and(Filters.gte(document.name(), betweenList.get(0)), Filters.lte(document.name(), betweenList.get(1))); diff --git a/jnosql-mongodb/src/main/java/org/eclipse/jnosql/databases/mongodb/communication/MongoDBUtils.java b/jnosql-mongodb/src/main/java/org/eclipse/jnosql/databases/mongodb/communication/MongoDBUtils.java index 06e052979..ae5e9ed43 100644 --- a/jnosql-mongodb/src/main/java/org/eclipse/jnosql/databases/mongodb/communication/MongoDBUtils.java +++ b/jnosql-mongodb/src/main/java/org/eclipse/jnosql/databases/mongodb/communication/MongoDBUtils.java @@ -27,7 +27,6 @@ import java.util.Map; import java.util.function.Function; import java.util.function.Predicate; -import java.util.function.UnaryOperator; import java.util.stream.StreamSupport; import static java.util.stream.StreamSupport.stream; @@ -35,8 +34,6 @@ final class MongoDBUtils { static final String ID_FIELD = "_id"; - private static final Function KEY_DOCUMENT = d -> cast(d).name(); - private static final UnaryOperator VALUE_DOCUMENT = d -> MongoDBUtils.convert(cast(d).value()); private MongoDBUtils() { } @@ -48,7 +45,7 @@ static Document getDocument(CommunicationEntity entity) { } private static Object convert(Value value) { - Object val = ValueUtil.convert(value); + Object val = ValueUtil.convert(value, MongoDBValueWriteDecorator.MONGO_DB_VALUE_WRITER); if (val instanceof Element subDocument) { Object converted = convert(subDocument.value()); return new Document(subDocument.name(), converted); diff --git a/jnosql-mongodb/src/main/java/org/eclipse/jnosql/databases/mongodb/communication/MongoDBValueWriteDecorator.java b/jnosql-mongodb/src/main/java/org/eclipse/jnosql/databases/mongodb/communication/MongoDBValueWriteDecorator.java new file mode 100644 index 000000000..3cdf7726b --- /dev/null +++ b/jnosql-mongodb/src/main/java/org/eclipse/jnosql/databases/mongodb/communication/MongoDBValueWriteDecorator.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2024 Contributors to the Eclipse Foundation + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * and Apache License v2.0 which accompanies this distribution. + * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html + * and the Apache License v2.0 is available at http://www.opensource.org/licenses/apache2.0.php. + * + * You may elect to redistribute this code under either of these licenses. + * + * Contributors: + * + * Otavio Santana + */ +package org.eclipse.jnosql.databases.mongodb.communication; + +import org.eclipse.jnosql.communication.ValueWriter; +import org.eclipse.jnosql.communication.ValueWriterDecorator; + +import java.util.UUID; + +final class MongoDBValueWriteDecorator implements ValueWriter { + + @SuppressWarnings("rawtypes") + static final ValueWriter MONGO_DB_VALUE_WRITER = new MongoDBValueWriteDecorator(); + + @SuppressWarnings("rawtypes") + private static final ValueWriter DEFAULT = ValueWriterDecorator.getInstance(); + + private static final UUIDValueWriter UUID_VALUE_WRITER = new UUIDValueWriter(); + + + @Override + public boolean test(Class type) { + return UUID_VALUE_WRITER.test(type) || DEFAULT.test(type); + } + + @SuppressWarnings("unchecked") + @Override + public S write(T type) { + if(type != null && UUID_VALUE_WRITER.test(type.getClass())) { + return (S) UUID_VALUE_WRITER.write((UUID) type); + } else { + return (S) DEFAULT.write(type); + } + } + +} diff --git a/jnosql-mongodb/src/main/resources/META-INF/services/org.eclipse.jnosql.communication.ValueReader b/jnosql-mongodb/src/main/resources/META-INF/services/org.eclipse.jnosql.communication.ValueReader index d76361057..9486ea87f 100644 --- a/jnosql-mongodb/src/main/resources/META-INF/services/org.eclipse.jnosql.communication.ValueReader +++ b/jnosql-mongodb/src/main/resources/META-INF/services/org.eclipse.jnosql.communication.ValueReader @@ -1,2 +1 @@ org.eclipse.jnosql.databases.mongodb.communication.BinaryValueReader -org.eclipse.jnosql.databases.mongodb.communication.UUIDValueReader diff --git a/jnosql-mongodb/src/main/resources/META-INF/services/org.eclipse.jnosql.communication.ValueWriter b/jnosql-mongodb/src/main/resources/META-INF/services/org.eclipse.jnosql.communication.ValueWriter deleted file mode 100644 index 1c499b074..000000000 --- a/jnosql-mongodb/src/main/resources/META-INF/services/org.eclipse.jnosql.communication.ValueWriter +++ /dev/null @@ -1 +0,0 @@ -org.eclipse.jnosql.databases.mongodb.communication.UUIDValueWriter diff --git a/jnosql-mongodb/src/main/java/org/eclipse/jnosql/databases/mongodb/communication/UUIDValueReader.java b/jnosql-mongodb/src/test/java/org/eclipse/jnosql/databases/mongodb/communication/MongoDBValueWriteDecoratorTest.java similarity index 62% rename from jnosql-mongodb/src/main/java/org/eclipse/jnosql/databases/mongodb/communication/UUIDValueReader.java rename to jnosql-mongodb/src/test/java/org/eclipse/jnosql/databases/mongodb/communication/MongoDBValueWriteDecoratorTest.java index 8c89a4629..a4ebfef5e 100644 --- a/jnosql-mongodb/src/main/java/org/eclipse/jnosql/databases/mongodb/communication/UUIDValueReader.java +++ b/jnosql-mongodb/src/test/java/org/eclipse/jnosql/databases/mongodb/communication/MongoDBValueWriteDecoratorTest.java @@ -14,24 +14,20 @@ */ package org.eclipse.jnosql.databases.mongodb.communication; -import org.eclipse.jnosql.communication.ValueReader; +import org.junit.jupiter.api.Test; import java.util.UUID; -public class UUIDValueReader implements ValueReader { +import static org.junit.jupiter.api.Assertions.*; - @Override - public boolean test(Class type) { - return UUID.class.equals(type); - } +@SuppressWarnings("rawtypes") +class MongoDBValueWriteDecoratorTest { + private final MongoDBValueWriteDecorator valueWriter = new MongoDBValueWriteDecorator<>(); - @SuppressWarnings("unchecked") - @Override - public T read(Class type, Object value) { - if (value instanceof UUID) { - return (T) value; - } - return null; + @Test + void shouldTestUUIDType() { + assertTrue(valueWriter.test(UUID.class)); } + } diff --git a/jnosql-mongodb/src/test/java/org/eclipse/jnosql/databases/mongodb/integration/MongoDBBook.java b/jnosql-mongodb/src/test/java/org/eclipse/jnosql/databases/mongodb/integration/MongoDBBook.java new file mode 100644 index 000000000..b61f22fc0 --- /dev/null +++ b/jnosql-mongodb/src/test/java/org/eclipse/jnosql/databases/mongodb/integration/MongoDBBook.java @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2024 Contributors to the Eclipse Foundation + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * and Apache License v2.0 which accompanies this distribution. + * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html + * and the Apache License v2.0 is available at http://www.opensource.org/licenses/apache2.0.php. + * + * You may elect to redistribute this code under either of these licenses. + * + * Contributors: + * + * Otavio Santana + * Alessandro Moscatelli + */ +package org.eclipse.jnosql.databases.mongodb.integration; + +import jakarta.nosql.Column; +import jakarta.nosql.Entity; +import jakarta.nosql.Id; + +import java.util.UUID; + +@Entity +public record MongoDBBook(@Id UUID id, @Column String title, @Column String author) { +} diff --git a/jnosql-mongodb/src/test/java/org/eclipse/jnosql/databases/mongodb/integration/MongoDBTemplateIntegrationTest.java b/jnosql-mongodb/src/test/java/org/eclipse/jnosql/databases/mongodb/integration/MongoDBTemplateIntegrationTest.java index 9bc1def9f..1f12c983b 100644 --- a/jnosql-mongodb/src/test/java/org/eclipse/jnosql/databases/mongodb/integration/MongoDBTemplateIntegrationTest.java +++ b/jnosql-mongodb/src/test/java/org/eclipse/jnosql/databases/mongodb/integration/MongoDBTemplateIntegrationTest.java @@ -138,6 +138,34 @@ void shouldUpdateNullValues(){ }); } + @Test + void shouldCreateMongoDBBook() { + var id = randomUUID(); + var title = "Persistence with MongoDB"; + var author = "Otavio Santana"; + var book = template.insert(new MongoDBBook(id, title, author)); + + SoftAssertions.assertSoftly(softly -> { + softly.assertThat(book).isNotNull(); + softly.assertThat(book.id()).isEqualTo(id); + softly.assertThat(book.title()).isEqualTo(title); + softly.assertThat(book.author()).isEqualTo(author); + }); + } + + @Test + void shouldFindByUUID() { + var id = randomUUID(); + var title = "Persistence with MongoDB"; + var author = "Otavio Santana"; + var book = template.insert(new MongoDBBook(id, title, author)); + + var optional = template.find(MongoDBBook.class, id); + assertThat(optional).isPresent(); + assertThat(optional.get().id()).isEqualTo(id); + assertThat(optional.get().title()).isEqualTo(title); + assertThat(optional.get().author()).isEqualTo(author); + } } diff --git a/jnosql-mongodb/src/test/java/org/eclipse/jnosql/databases/mongodb/mapping/DefaultMongoDBTemplateTest.java b/jnosql-mongodb/src/test/java/org/eclipse/jnosql/databases/mongodb/mapping/DefaultMongoDBTemplateTest.java index 45ca64a04..afdef98e7 100644 --- a/jnosql-mongodb/src/test/java/org/eclipse/jnosql/databases/mongodb/mapping/DefaultMongoDBTemplateTest.java +++ b/jnosql-mongodb/src/test/java/org/eclipse/jnosql/databases/mongodb/mapping/DefaultMongoDBTemplateTest.java @@ -25,12 +25,12 @@ import org.eclipse.jnosql.communication.semistructured.Element; import org.eclipse.jnosql.databases.mongodb.communication.MongoDBDocumentManager; import org.eclipse.jnosql.mapping.core.Converters; +import org.eclipse.jnosql.mapping.core.spi.EntityMetadataExtension; import org.eclipse.jnosql.mapping.document.DocumentTemplate; import org.eclipse.jnosql.mapping.document.spi.DocumentExtension; import org.eclipse.jnosql.mapping.metadata.EntitiesMetadata; import org.eclipse.jnosql.mapping.metadata.EntityMetadata; import org.eclipse.jnosql.mapping.reflection.Reflections; -import org.eclipse.jnosql.mapping.core.spi.EntityMetadataExtension; import org.eclipse.jnosql.mapping.semistructured.EntityConverter; import org.eclipse.jnosql.mapping.semistructured.EventPersistManager; import org.jboss.weld.junit5.auto.AddExtensions; @@ -243,5 +243,4 @@ void shouldReturnErrorOnCountByFilterMethod() { assertThrows(NullPointerException.class, () -> template.count((Class) null, filter)); assertThrows(NullPointerException.class, () -> template.count(Person.class, null)); } - }