diff --git a/src/main/java/io/ebeaninternal/server/query/DbOrderByTrim.java b/src/main/java/io/ebeaninternal/server/query/DbOrderByTrim.java new file mode 100644 index 000000000..2edfe488b --- /dev/null +++ b/src/main/java/io/ebeaninternal/server/query/DbOrderByTrim.java @@ -0,0 +1,17 @@ +package io.ebeaninternal.server.query; + +import java.util.regex.Pattern; + +class DbOrderByTrim { + + private static final Pattern orderByTrim = Pattern.compile("(?i)\\b asc\\b|\\b desc\\b"); + + /** + * Convert the dbOrderBy clause to be safe for adding to select or distinct on. + */ + static String trim(String dbOrderBy) { + // just remove the ASC and DESC keywords + return orderByTrim.matcher(dbOrderBy).replaceAll(""); + } + +} diff --git a/src/test/java/io/ebeaninternal/server/query/SqlTreeBuilderTest.java b/src/test/java/io/ebeaninternal/server/query/SqlTreeBuilderTest.java new file mode 100644 index 000000000..7b8232ba6 --- /dev/null +++ b/src/test/java/io/ebeaninternal/server/query/SqlTreeBuilderTest.java @@ -0,0 +1,63 @@ +package io.ebeaninternal.server.query; + +import org.junit.Test; + +import static org.junit.Assert.*; + +public class SqlTreeBuilderTest { + + @Test + public void mergeOnDistinct_equal() throws Exception { + + assertEquals(SqlTreeBuilder.mergeOnDistinct("t0.id", "t0.id"), "t0.id"); + } + + @Test + public void mergeOnDistinct_add() throws Exception { + + assertEquals(SqlTreeBuilder.mergeOnDistinct("t0.id", "t0.cre"), "t0.cre, t0.id"); + } + + @Test + public void mergeOnDistinct_contained() throws Exception { + + assertEquals(SqlTreeBuilder.mergeOnDistinct("t0.id", "t0.cre, t0.id"), "t0.cre, t0.id"); + } + + @Test + public void mergeOnDistinct_overlap() throws Exception { + + assertEquals(SqlTreeBuilder.mergeOnDistinct("t0.id, t1.id", "t0.cre, t0.id"), "t0.cre, t0.id, t1.id"); + } + + @Test + public void mergeOnDistinct_overlapBoth() throws Exception { + + assertEquals(SqlTreeBuilder.mergeOnDistinct("t0.id, t1.id", "t0.cre, t1.id, t0.id"), "t0.cre, t1.id, t0.id"); + } + + @Test + public void mergeOnDistinct_inlineAscDesc() throws Exception { + + assertEquals(SqlTreeBuilder.mergeOnDistinct("t0.id", "t0.cre asc, t1.bb desc, t3.b"), "t0.cre, t1.bb, t3.b, t0.id"); + } + + @Test + public void mergeOnDistinct_inlineAscDesc2() throws Exception { + + assertEquals(SqlTreeBuilder.mergeOnDistinct("t0.id", "t0.cre desc, t1.bb asc, t3.b"), "t0.cre, t1.bb, t3.b, t0.id"); + } + + @Test + public void mergeOnDistinct_trailingAsc() throws Exception { + + assertEquals(SqlTreeBuilder.mergeOnDistinct("t0.id", "t0.cre asc"), "t0.cre, t0.id"); + } + + @Test + public void mergeOnDistinct_trailingDesc() throws Exception { + + assertEquals(SqlTreeBuilder.mergeOnDistinct("t0.id", "t0.cre desc"), "t0.cre, t0.id"); + } + +} diff --git a/src/test/java/org/tests/model/json/EBasicJsonMapDetail.java b/src/test/java/org/tests/model/json/EBasicJsonMapDetail.java new file mode 100644 index 000000000..e220af18c --- /dev/null +++ b/src/test/java/org/tests/model/json/EBasicJsonMapDetail.java @@ -0,0 +1,71 @@ +package org.tests.model.json; + +import io.ebean.annotation.DbJson; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.ManyToOne; +import javax.persistence.Version; +import java.util.Map; + +@Entity +public class EBasicJsonMapDetail { + + @Id + Long id; + + @ManyToOne + EBasicJsonMap owner; + + @Version + Long version; + + String name; + + @DbJson + Map content; + + public EBasicJsonMapDetail(String name) { + this.name = name; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getVersion() { + return version; + } + + public void setVersion(Long version) { + this.version = version; + } + + public EBasicJsonMap getOwner() { + return owner; + } + + public void setOwner(EBasicJsonMap owner) { + this.owner = owner; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Map getContent() { + return content; + } + + public void setContent(Map content) { + this.content = content; + } +}