From e3a7c3040bc8ec6ffe39e2d279fbd56a34c74aa4 Mon Sep 17 00:00:00 2001 From: Robin Bygrave Date: Thu, 19 May 2016 09:35:39 +1200 Subject: [PATCH] #540 - Add tests for ... RawSqlBuilder columnMapping is confused by commas in COALESCE (actually fixed in 6.14.1) --- .../com/avaje/ebean/TestRawSqlBuilder.java | 63 +++++++++++++++++++ .../tests/model/rawsql/ERawSqlAggBean.java | 48 ++++++++++++++ 2 files changed, 111 insertions(+) create mode 100644 src/test/java/com/avaje/tests/model/rawsql/ERawSqlAggBean.java diff --git a/src/test/java/com/avaje/ebean/TestRawSqlBuilder.java b/src/test/java/com/avaje/ebean/TestRawSqlBuilder.java index d2ad2538b..da46e54eb 100644 --- a/src/test/java/com/avaje/ebean/TestRawSqlBuilder.java +++ b/src/test/java/com/avaje/ebean/TestRawSqlBuilder.java @@ -2,10 +2,12 @@ package com.avaje.ebean; import com.avaje.tests.model.basic.Customer; import com.avaje.tests.model.basic.ResetBasicData; +import com.avaje.tests.model.rawsql.ERawSqlAggBean; import org.junit.Test; import com.avaje.ebean.RawSql.Sql; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; @@ -172,4 +174,65 @@ public class TestRawSqlBuilder extends BaseTestCase { } + @Test + public void testWithCoalesceFunction() { + + String rs = "select id, coalesce(status,'E') as status, "+ + " budgets.amount as budget," + + " COALESCE(month_sums.sum,0.0) as transaction_sum, " + + " COALESCE(month_balances.balance,0.0) as balance, " + + " COALESCE(month_sums.end_date,date_trunc('month',budgets.month),month_balances.end_date) as data_month"+ + " from o_order order by id asc"; + + RawSqlBuilder builder = RawSqlBuilder.parse(rs); + + RawSql rawSql = builder.create(); + RawSql.ColumnMapping columnMapping = rawSql.getColumnMapping(); + + assertEquals(0, columnMapping.getIndexPosition("id")); + assertEquals(1, columnMapping.getIndexPosition("status")); + assertEquals(2, columnMapping.getIndexPosition("budget")); + assertEquals(3, columnMapping.getIndexPosition("transaction_sum")); + assertEquals(4, columnMapping.getIndexPosition("balance")); + assertEquals(5, columnMapping.getIndexPosition("data_month")); + } + + @Test + public void postgres_parse_withDateTruncCaseHaving() { + + if (!isPostgres()) { + return; + } + + ResetBasicData.reset(); + + String sql = "select DATE_TRUNC('DAY', d.order_date) as day," + + " count(*) as total," + + " sum(case when d.status = 0 then 2 else 3 end) as scheduled," + + " sum(case when d.status = 1 then 1 else 0 end) as completed" + + " from o_order d" + + " group by DATE_TRUNC('DAY', d.order_date)"; + + RawSql rawSql = RawSqlBuilder.parse(sql).create(); + + RawSql.ColumnMapping columnMapping = rawSql.getColumnMapping(); + + assertEquals(0, columnMapping.getIndexPosition("day")); + assertEquals(1, columnMapping.getIndexPosition("total")); + assertEquals(2, columnMapping.getIndexPosition("scheduled")); + assertEquals(3, columnMapping.getIndexPosition("completed")); + + Query query = Ebean.find(ERawSqlAggBean.class) + .setRawSql(rawSql) + .having().gt("total", 2) + .query(); + + + query.findList(); + + String fullSql = query.getGeneratedSql(); + assertThat(fullSql).contains(" having count(*) > ?"); + + } + } diff --git a/src/test/java/com/avaje/tests/model/rawsql/ERawSqlAggBean.java b/src/test/java/com/avaje/tests/model/rawsql/ERawSqlAggBean.java new file mode 100644 index 000000000..70e5f1749 --- /dev/null +++ b/src/test/java/com/avaje/tests/model/rawsql/ERawSqlAggBean.java @@ -0,0 +1,48 @@ +package com.avaje.tests.model.rawsql; + +import com.avaje.ebean.annotation.Sql; + +import javax.persistence.Entity; +import java.time.LocalDate; + +@Entity +@Sql +public class ERawSqlAggBean { + + LocalDate day; + long total; + int scheduled; + int completed; + + public LocalDate getDay() { + return day; + } + + public void setDay(LocalDate day) { + this.day = day; + } + + public long getTotal() { + return total; + } + + public void setTotal(long total) { + this.total = total; + } + + public int getScheduled() { + return scheduled; + } + + public void setScheduled(int scheduled) { + this.scheduled = scheduled; + } + + public int getCompleted() { + return completed; + } + + public void setCompleted(int completed) { + this.completed = completed; + } +}