[#2665] Added support for the DELETE statement's clauses

This commit is contained in:
Lukas Eder 2013-08-15 14:55:14 +02:00
parent a3afd79816
commit 01831122ac
2 changed files with 203 additions and 122 deletions

View File

@ -38,6 +38,8 @@ package org.jooq.impl;
import static java.util.Arrays.asList;
import static org.jooq.Clause.DELETE;
import static org.jooq.Clause.DELETE_DELETE;
import static org.jooq.Clause.DELETE_WHERE;
import static org.jooq.SQLDialect.MARIADB;
import static org.jooq.SQLDialect.MYSQL;
@ -104,7 +106,8 @@ class DeleteQueryImpl<R extends Record> extends AbstractQuery implements DeleteQ
public final void toSQL(RenderContext context) {
boolean declare = context.declareTables();
context.keyword("delete").sql(" ");
context.start(DELETE_DELETE)
.keyword("delete").sql(" ");
// [#2464] MySQL supports a peculiar multi-table DELETE syntax for aliased tables:
// DELETE t1 FROM my_table AS t1
@ -119,16 +122,20 @@ class DeleteQueryImpl<R extends Record> extends AbstractQuery implements DeleteQ
}
}
context.keyword("from").sql(" ");
context.declareTables(true)
context.keyword("from").sql(" ")
.declareTables(true)
.visit(getFrom())
.declareTables(declare);
.declareTables(declare)
.end(DELETE_DELETE)
.start(DELETE_WHERE);
if (!(getWhere() instanceof TrueCondition)) {
context.formatSeparator()
.keyword("where").sql(" ")
.visit(getWhere());
}
context.end(DELETE_WHERE);
}
@Override

View File

@ -53,6 +53,9 @@ import static org.jooq.Clause.CONDITION_NOT_BETWEEN_SYMMETRIC;
import static org.jooq.Clause.CONDITION_NOT_EXISTS;
import static org.jooq.Clause.CONDITION_NOT_IN;
import static org.jooq.Clause.CONDITION_OR;
import static org.jooq.Clause.DELETE;
import static org.jooq.Clause.DELETE_DELETE;
import static org.jooq.Clause.DELETE_WHERE;
import static org.jooq.Clause.FIELD;
import static org.jooq.Clause.FIELD_ALIAS;
import static org.jooq.Clause.FIELD_REFERENCE;
@ -100,14 +103,23 @@ import static org.jooq.test.data.Table1.FIELD_ID1;
import static org.jooq.test.data.Table1.FIELD_NAME1;
import static org.jooq.test.data.Table1.TABLE1;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.jooq.BindContext;
import org.jooq.Clause;
import org.jooq.DSLContext;
import org.jooq.QueryPart;
import org.jooq.RenderContext;
import org.jooq.VisitContext;
import org.jooq.VisitListener;
import org.jooq.impl.DSL;
import org.jooq.tools.jdbc.MockConnection;
import org.jooq.tools.jdbc.MockDataProvider;
import org.jooq.tools.jdbc.MockExecuteContext;
import org.jooq.tools.jdbc.MockResult;
import org.jooq.tools.jdbc.MockStatement;
import org.junit.After;
import org.junit.Before;
@ -142,8 +154,6 @@ public class VisitContextTest extends AbstractTest {
// Postgres supports VALUES table constructors
ctx.configuration().set(POSTGRES);
ctx.renderContext().declareTables(true).render(values(row(1, "value"), row(2, "value")));
assertEvents(asList(
asList(TABLE),
asList(TABLE, TABLE_ALIAS),
@ -159,59 +169,58 @@ public class VisitContextTest extends AbstractTest {
asList(TABLE, TABLE_ALIAS, TABLE, TABLE_VALUES, FIELD_ROW, FIELD, FIELD_VALUE),
asList(TABLE, TABLE_ALIAS, TABLE, TABLE_VALUES, FIELD_ROW, FIELD),
asList(TABLE, TABLE_ALIAS, TABLE, TABLE_VALUES, FIELD_ROW, FIELD, FIELD_VALUE)
));
),
values(row(1, "value"), row(2, "value")),
r_ctx().declareTables(true),
b_ctx().declareTables(true));
}
@Test
public void test_tableAliasReference() {
ctx.render(TABLE1.as("x"));
assertEvents(asList(
asList(TABLE),
asList(TABLE, TABLE_REFERENCE)
));
),
TABLE1.as("x"));
}
@Test
public void test_tableAliasDeclaration() {
ctx.renderContext().declareTables(true).render(TABLE1.as("x"));
assertEvents(asList(
asList(TABLE),
asList(TABLE, TABLE_ALIAS),
asList(TABLE, TABLE_ALIAS, TABLE),
asList(TABLE, TABLE_ALIAS, TABLE, TABLE_REFERENCE)
));
),
TABLE1.as("x"),
r_ctx().declareTables(true),
b_ctx().declareTables(true));
}
@Test
public void test_fieldAliasReference() {
ctx.render(FIELD_ID1.as("x"));
assertEvents(asList(
asList(FIELD),
asList(FIELD, FIELD_REFERENCE)
));
),
FIELD_ID1.as("x"));
}
@Test
public void test_fieldAliasDeclaration() {
ctx.renderContext().declareFields(true).render(FIELD_ID1.as("x"));
assertEvents(asList(
asList(FIELD),
asList(FIELD, FIELD_ALIAS),
asList(FIELD, FIELD_ALIAS, FIELD),
asList(FIELD, FIELD_ALIAS, FIELD, FIELD_REFERENCE)
));
),
FIELD_ID1.as("x"),
r_ctx().declareFields(true),
b_ctx().declareFields(true));
}
@Test
public void test_INSERT_VALUES_simple() {
ctx.insertInto(TABLE1)
.values(1, "value", null)
.getSQL();
assertEvents(asList(
asList(INSERT),
asList(INSERT, INSERT_INSERT_INTO),
@ -233,7 +242,9 @@ public class VisitContextTest extends AbstractTest {
asList(INSERT, INSERT_VALUES, FIELD_ROW, FIELD, FIELD_VALUE),
asList(INSERT, INSERT_ON_DUPLICATE_KEY_UPDATE),
asList(INSERT, INSERT_RETURNING)
));
),
ctx.insertInto(TABLE1)
.values(1, "value", null));
}
@Test
@ -241,11 +252,6 @@ public class VisitContextTest extends AbstractTest {
// Postgres is the only dialect to actually have a RETURNING clause.
ctx.configuration().set(POSTGRES);
ctx.insertInto(TABLE1)
.values(1, "value", null)
.returning(FIELD_ID1, FIELD_NAME1)
.getSQL();
assertEvents(asList(
asList(INSERT),
asList(INSERT, INSERT_INSERT_INTO),
@ -271,7 +277,10 @@ public class VisitContextTest extends AbstractTest {
asList(INSERT, INSERT_RETURNING, FIELD, FIELD_REFERENCE),
asList(INSERT, INSERT_RETURNING, FIELD),
asList(INSERT, INSERT_RETURNING, FIELD, FIELD_REFERENCE)
));
),
ctx.insertInto(TABLE1)
.values(1, "value", null)
.returning(FIELD_ID1, FIELD_NAME1));
}
@Test
@ -279,12 +288,6 @@ public class VisitContextTest extends AbstractTest {
// Use MySQL to actually render ON DUPLICATE KEY UPDATE
ctx.configuration().set(MYSQL);
ctx.insertInto(TABLE1)
.values(1, "value", null)
.onDuplicateKeyUpdate()
.set(FIELD_NAME1, "value")
.set(FIELD_DATE1, FIELD_DATE1)
.getSQL();
assertEvents(asList(
asList(INSERT),
@ -317,7 +320,12 @@ public class VisitContextTest extends AbstractTest {
asList(INSERT, INSERT_ON_DUPLICATE_KEY_UPDATE, INSERT_ON_DUPLICATE_KEY_UPDATE_ASSIGNMENT, FIELD),
asList(INSERT, INSERT_ON_DUPLICATE_KEY_UPDATE, INSERT_ON_DUPLICATE_KEY_UPDATE_ASSIGNMENT, FIELD, FIELD_REFERENCE),
asList(INSERT, INSERT_RETURNING)
));
),
ctx.insertInto(TABLE1)
.values(1, "value", null)
.onDuplicateKeyUpdate()
.set(FIELD_NAME1, "value")
.set(FIELD_DATE1, FIELD_DATE1));
}
@Test
@ -325,10 +333,6 @@ public class VisitContextTest extends AbstractTest {
// Postgres has a native implementation for multi-value inserts
ctx.configuration().set(POSTGRES);
ctx.insertInto(TABLE1)
.values(1, "value", null)
.values(2, "value", null)
.getSQL();
assertEvents(asList(
asList(INSERT),
@ -358,17 +362,16 @@ public class VisitContextTest extends AbstractTest {
asList(INSERT, INSERT_VALUES, FIELD_ROW, FIELD, FIELD_VALUE),
asList(INSERT, INSERT_ON_DUPLICATE_KEY_UPDATE),
asList(INSERT, INSERT_RETURNING)
));
),
ctx.insertInto(TABLE1)
.values(1, "value", null)
.values(2, "value", null));
}
@Test
public void test_INSERT_VALUES_multiple_emulated() {
// Oracle emulates multi-record inserts through INSERT .. SELECT
ctx.insertInto(TABLE1)
.values(1, "value", null)
.values(2, "value", null)
.getSQL();
assertEvents(asList(
asList(INSERT),
@ -417,15 +420,14 @@ public class VisitContextTest extends AbstractTest {
asList(INSERT, INSERT_SELECT, SELECT_UNION_ALL, SELECT, SELECT_ORDER_BY),
asList(INSERT, INSERT_ON_DUPLICATE_KEY_UPDATE),
asList(INSERT, INSERT_RETURNING)
));
),
ctx.insertInto(TABLE1)
.values(1, "value", null)
.values(2, "value", null));
}
@Test
public void test_INSERT_SELECT() {
ctx.insertInto(TABLE1)
.select(select(val(1), val("value"), val(null)))
.getSQL();
assertEvents(asList(
asList(INSERT),
asList(INSERT, INSERT_INSERT_INTO),
@ -456,15 +458,46 @@ public class VisitContextTest extends AbstractTest {
asList(INSERT, INSERT_SELECT, SELECT, SELECT_ORDER_BY),
asList(INSERT, INSERT_ON_DUPLICATE_KEY_UPDATE),
asList(INSERT, INSERT_RETURNING)
));
),
ctx.insertInto(TABLE1)
.select(select(val(1), val("value"), val(null))));
}
@Test
public void test_DELETE_simple() {
assertEvents(asList(
asList(DELETE),
asList(DELETE, DELETE_DELETE),
asList(DELETE, DELETE_DELETE, TABLE),
asList(DELETE, DELETE_DELETE, TABLE, TABLE_REFERENCE),
asList(DELETE, DELETE_WHERE)
),
ctx.delete(TABLE1));
}
@Test
public void test_DELETE_WHERE() {
QueryPart part =
ctx.delete(TABLE1)
.where(FIELD_ID1.eq(1));
assertEvents(asList(
asList(DELETE),
asList(DELETE, DELETE_DELETE),
asList(DELETE, DELETE_DELETE, TABLE),
asList(DELETE, DELETE_DELETE, TABLE, TABLE_REFERENCE),
asList(DELETE, DELETE_WHERE),
asList(DELETE, DELETE_WHERE, CONDITION),
asList(DELETE, DELETE_WHERE, CONDITION, CONDITION_COMPARISON),
asList(DELETE, DELETE_WHERE, CONDITION, CONDITION_COMPARISON, FIELD),
asList(DELETE, DELETE_WHERE, CONDITION, CONDITION_COMPARISON, FIELD, FIELD_REFERENCE),
asList(DELETE, DELETE_WHERE, CONDITION, CONDITION_COMPARISON, FIELD),
asList(DELETE, DELETE_WHERE, CONDITION, CONDITION_COMPARISON, FIELD, FIELD_VALUE)
), part);
}
@Test
public void test_UPDATE_SET_simple() {
ctx.update(TABLE1)
.set(FIELD_NAME1, "value")
.getSQL();
assertEvents(asList(
asList(UPDATE),
asList(UPDATE, UPDATE_UPDATE),
@ -478,16 +511,13 @@ public class VisitContextTest extends AbstractTest {
asList(UPDATE, UPDATE_SET, UPDATE_SET_ASSIGNMENT, FIELD, FIELD_VALUE),
asList(UPDATE, UPDATE_WHERE),
asList(UPDATE, UPDATE_RETURNING)
));
),
ctx.update(TABLE1)
.set(FIELD_NAME1, "value"));
}
@Test
public void test_UPDATE_SET_twoValues() {
ctx.update(TABLE1)
.set(FIELD_NAME1, "value")
.set(FIELD_DATE1, FIELD_DATE1)
.getSQL();
assertEvents(asList(
asList(UPDATE),
asList(UPDATE, UPDATE_UPDATE),
@ -506,7 +536,10 @@ public class VisitContextTest extends AbstractTest {
asList(UPDATE, UPDATE_SET, UPDATE_SET_ASSIGNMENT, FIELD, FIELD_REFERENCE),
asList(UPDATE, UPDATE_WHERE),
asList(UPDATE, UPDATE_RETURNING)
));
),
ctx.update(TABLE1)
.set(FIELD_NAME1, "value")
.set(FIELD_DATE1, FIELD_DATE1));
}
@Test
@ -514,12 +547,6 @@ public class VisitContextTest extends AbstractTest {
// Postgres is known to support this syntax particularly well
ctx.configuration().set(POSTGRES);
ctx.update(TABLE1)
.set(row(FIELD_NAME1, FIELD_DATE1),
row(val("value"), FIELD_DATE1))
.getSQL();
assertEvents(asList(
asList(UPDATE),
asList(UPDATE, UPDATE_UPDATE),
@ -539,16 +566,14 @@ public class VisitContextTest extends AbstractTest {
asList(UPDATE, UPDATE_SET, UPDATE_SET_ASSIGNMENT, FIELD_ROW, FIELD, FIELD_REFERENCE),
asList(UPDATE, UPDATE_WHERE),
asList(UPDATE, UPDATE_RETURNING)
));
),
ctx.update(TABLE1)
.set(row(FIELD_NAME1, FIELD_DATE1),
row(val("value"), FIELD_DATE1)));
}
@Test
public void test_UPDATE_SET_WHERE() {
ctx.update(TABLE1)
.set(FIELD_NAME1, "value")
.where(FIELD_ID1.eq(1))
.getSQL();
assertEvents(asList(
asList(UPDATE),
asList(UPDATE, UPDATE_UPDATE),
@ -568,13 +593,42 @@ public class VisitContextTest extends AbstractTest {
asList(UPDATE, UPDATE_WHERE, CONDITION, CONDITION_COMPARISON, FIELD),
asList(UPDATE, UPDATE_WHERE, CONDITION, CONDITION_COMPARISON, FIELD, FIELD_VALUE),
asList(UPDATE, UPDATE_RETURNING)
));
),
ctx.update(TABLE1)
.set(FIELD_NAME1, "value")
.where(FIELD_ID1.eq(1)));
}
@Test
public void test_UPDATE_SET_RETURNING() {
// Postgres is the only DB to support the RETURNING clause
ctx.configuration().set(POSTGRES);
assertEvents(asList(
asList(UPDATE),
asList(UPDATE, UPDATE_UPDATE),
asList(UPDATE, UPDATE_UPDATE, TABLE),
asList(UPDATE, UPDATE_UPDATE, TABLE, TABLE_REFERENCE),
asList(UPDATE, UPDATE_SET),
asList(UPDATE, UPDATE_SET, UPDATE_SET_ASSIGNMENT),
asList(UPDATE, UPDATE_SET, UPDATE_SET_ASSIGNMENT, FIELD),
asList(UPDATE, UPDATE_SET, UPDATE_SET_ASSIGNMENT, FIELD, FIELD_REFERENCE),
asList(UPDATE, UPDATE_SET, UPDATE_SET_ASSIGNMENT, FIELD),
asList(UPDATE, UPDATE_SET, UPDATE_SET_ASSIGNMENT, FIELD, FIELD_VALUE),
asList(UPDATE, UPDATE_WHERE),
asList(UPDATE, UPDATE_RETURNING),
asList(UPDATE, UPDATE_RETURNING, FIELD),
asList(UPDATE, UPDATE_RETURNING, FIELD, FIELD_REFERENCE),
asList(UPDATE, UPDATE_RETURNING, FIELD),
asList(UPDATE, UPDATE_RETURNING, FIELD, FIELD_REFERENCE)
),
ctx.update(TABLE1)
.set(FIELD_NAME1, "value")
.returning(FIELD_ID1, FIELD_NAME1));
}
@Test
public void test_CONDITION_simple() {
ctx.render(FIELD_ID1.eq(1));
assertEvents(asList(
asList(CONDITION),
asList(CONDITION, CONDITION_COMPARISON),
@ -582,13 +636,12 @@ public class VisitContextTest extends AbstractTest {
asList(CONDITION, CONDITION_COMPARISON, FIELD, FIELD_REFERENCE),
asList(CONDITION, CONDITION_COMPARISON, FIELD),
asList(CONDITION, CONDITION_COMPARISON, FIELD, FIELD_VALUE)
));
),
FIELD_ID1.eq(1));
}
@Test
public void test_CONDITION_NOT() {
ctx.render(FIELD_ID1.eq(1).not());
assertEvents(asList(
asList(CONDITION),
asList(CONDITION, CONDITION_NOT),
@ -598,13 +651,12 @@ public class VisitContextTest extends AbstractTest {
asList(CONDITION, CONDITION_NOT, CONDITION, CONDITION_COMPARISON, FIELD, FIELD_REFERENCE),
asList(CONDITION, CONDITION_NOT, CONDITION, CONDITION_COMPARISON, FIELD),
asList(CONDITION, CONDITION_NOT, CONDITION, CONDITION_COMPARISON, FIELD, FIELD_VALUE)
));
),
FIELD_ID1.eq(1).not());
}
@Test
public void test_CONDITION_AND() {
ctx.render(FIELD_ID1.eq(1).and(FIELD_NAME1.isNotNull()));
assertEvents(asList(
asList(CONDITION),
asList(CONDITION, CONDITION_AND),
@ -618,13 +670,12 @@ public class VisitContextTest extends AbstractTest {
asList(CONDITION, CONDITION_AND, CONDITION, CONDITION_IS_NOT_NULL),
asList(CONDITION, CONDITION_AND, CONDITION, CONDITION_IS_NOT_NULL, FIELD),
asList(CONDITION, CONDITION_AND, CONDITION, CONDITION_IS_NOT_NULL, FIELD, FIELD_REFERENCE)
));
),
FIELD_ID1.eq(1).and(FIELD_NAME1.isNotNull()));
}
@Test
public void test_CONDITION_OR() {
ctx.render(FIELD_ID1.eq(1).or(FIELD_NAME1.isNull()));
assertEvents(asList(
asList(CONDITION),
asList(CONDITION, CONDITION_OR),
@ -638,37 +689,34 @@ public class VisitContextTest extends AbstractTest {
asList(CONDITION, CONDITION_OR, CONDITION, CONDITION_IS_NULL),
asList(CONDITION, CONDITION_OR, CONDITION, CONDITION_IS_NULL, FIELD),
asList(CONDITION, CONDITION_OR, CONDITION, CONDITION_IS_NULL, FIELD, FIELD_REFERENCE)
));
),
FIELD_ID1.eq(1).or(FIELD_NAME1.isNull()));
}
@Test
public void test_CONDITION_NULL() {
ctx.render(FIELD_ID1.isNull());
assertEvents(asList(
asList(CONDITION),
asList(CONDITION, CONDITION_IS_NULL),
asList(CONDITION, CONDITION_IS_NULL, FIELD),
asList(CONDITION, CONDITION_IS_NULL, FIELD, FIELD_REFERENCE)
));
),
FIELD_ID1.isNull());
}
@Test
public void test_CONDITION_NOT_NULL() {
ctx.render(FIELD_ID1.isNotNull());
assertEvents(asList(
asList(CONDITION),
asList(CONDITION, CONDITION_IS_NOT_NULL),
asList(CONDITION, CONDITION_IS_NOT_NULL, FIELD),
asList(CONDITION, CONDITION_IS_NOT_NULL, FIELD, FIELD_REFERENCE)
));
),
FIELD_ID1.isNotNull());
}
@Test
public void test_CONDITION_IN() {
ctx.render(FIELD_ID1.in(1, 2));
assertEvents(asList(
asList(CONDITION),
asList(CONDITION, CONDITION_IN),
@ -678,13 +726,12 @@ public class VisitContextTest extends AbstractTest {
asList(CONDITION, CONDITION_IN, FIELD, FIELD_VALUE),
asList(CONDITION, CONDITION_IN, FIELD),
asList(CONDITION, CONDITION_IN, FIELD, FIELD_VALUE)
));
),
FIELD_ID1.in(1, 2));
}
@Test
public void test_CONDITION_NOT_IN() {
ctx.render(FIELD_ID1.notIn(1, 2));
assertEvents(asList(
asList(CONDITION),
asList(CONDITION, CONDITION_NOT_IN),
@ -694,7 +741,8 @@ public class VisitContextTest extends AbstractTest {
asList(CONDITION, CONDITION_NOT_IN, FIELD, FIELD_VALUE),
asList(CONDITION, CONDITION_NOT_IN, FIELD),
asList(CONDITION, CONDITION_NOT_IN, FIELD, FIELD_VALUE)
));
),
FIELD_ID1.notIn(1, 2));
}
@Test
@ -702,8 +750,6 @@ public class VisitContextTest extends AbstractTest {
// Omit "dual" with Postgres
ctx.configuration().set(POSTGRES);
ctx.render(exists(selectOne()));
assertEvents(asList(
asList(CONDITION),
asList(CONDITION, CONDITION_EXISTS),
@ -718,7 +764,8 @@ public class VisitContextTest extends AbstractTest {
asList(CONDITION, CONDITION_EXISTS, SELECT, SELECT_GROUP_BY),
asList(CONDITION, CONDITION_EXISTS, SELECT, SELECT_HAVING),
asList(CONDITION, CONDITION_EXISTS, SELECT, SELECT_ORDER_BY)
));
),
exists(selectOne()));
}
@Test
@ -726,8 +773,6 @@ public class VisitContextTest extends AbstractTest {
// Omit "dual" with Postgres
ctx.configuration().set(POSTGRES);
ctx.render(notExists(selectOne()));
assertEvents(asList(
asList(CONDITION),
asList(CONDITION, CONDITION_NOT_EXISTS),
@ -742,13 +787,12 @@ public class VisitContextTest extends AbstractTest {
asList(CONDITION, CONDITION_NOT_EXISTS, SELECT, SELECT_GROUP_BY),
asList(CONDITION, CONDITION_NOT_EXISTS, SELECT, SELECT_HAVING),
asList(CONDITION, CONDITION_NOT_EXISTS, SELECT, SELECT_ORDER_BY)
));
),
notExists(selectOne()));
}
@Test
public void test_CONDITION_BETWEEN() {
ctx.render(FIELD_ID1.between(1).and(2));
assertEvents(asList(
asList(CONDITION),
asList(CONDITION, CONDITION_BETWEEN),
@ -758,13 +802,12 @@ public class VisitContextTest extends AbstractTest {
asList(CONDITION, CONDITION_BETWEEN, FIELD, FIELD_VALUE),
asList(CONDITION, CONDITION_BETWEEN, FIELD),
asList(CONDITION, CONDITION_BETWEEN, FIELD, FIELD_VALUE)
));
),
FIELD_ID1.between(1).and(2));
}
@Test
public void test_CONDITION_NOT_BETWEEN() {
ctx.render(FIELD_ID1.notBetween(1, 2));
assertEvents(asList(
asList(CONDITION),
asList(CONDITION, CONDITION_NOT_BETWEEN),
@ -774,7 +817,8 @@ public class VisitContextTest extends AbstractTest {
asList(CONDITION, CONDITION_NOT_BETWEEN, FIELD, FIELD_VALUE),
asList(CONDITION, CONDITION_NOT_BETWEEN, FIELD),
asList(CONDITION, CONDITION_NOT_BETWEEN, FIELD, FIELD_VALUE)
));
),
FIELD_ID1.notBetween(1, 2));
}
@Test
@ -782,8 +826,6 @@ public class VisitContextTest extends AbstractTest {
// Use Postgres for its native SYMMETRIC support
ctx.configuration().set(POSTGRES);
ctx.render(FIELD_ID1.betweenSymmetric(1).and(2));
assertEvents(asList(
asList(CONDITION),
asList(CONDITION, CONDITION_BETWEEN_SYMMETRIC),
@ -793,7 +835,8 @@ public class VisitContextTest extends AbstractTest {
asList(CONDITION, CONDITION_BETWEEN_SYMMETRIC, FIELD, FIELD_VALUE),
asList(CONDITION, CONDITION_BETWEEN_SYMMETRIC, FIELD),
asList(CONDITION, CONDITION_BETWEEN_SYMMETRIC, FIELD, FIELD_VALUE)
));
),
FIELD_ID1.betweenSymmetric(1).and(2));
}
@Test
@ -801,8 +844,6 @@ public class VisitContextTest extends AbstractTest {
// Use Postgres for its native SYMMETRIC support
ctx.configuration().set(POSTGRES);
ctx.render(FIELD_ID1.notBetweenSymmetric(1, 2));
assertEvents(asList(
asList(CONDITION),
asList(CONDITION, CONDITION_NOT_BETWEEN_SYMMETRIC),
@ -812,7 +853,8 @@ public class VisitContextTest extends AbstractTest {
asList(CONDITION, CONDITION_NOT_BETWEEN_SYMMETRIC, FIELD, FIELD_VALUE),
asList(CONDITION, CONDITION_NOT_BETWEEN_SYMMETRIC, FIELD),
asList(CONDITION, CONDITION_NOT_BETWEEN_SYMMETRIC, FIELD, FIELD_VALUE)
));
),
FIELD_ID1.notBetweenSymmetric(1, 2));
}
@Test
@ -820,8 +862,6 @@ public class VisitContextTest extends AbstractTest {
// Use Postgres for its native SYMMETRIC support
ctx.configuration().set(POSTGRES);
ctx.render(row(FIELD_ID1, FIELD_NAME1).notBetweenSymmetric(1, "a").and(2, "b"));
assertEvents(asList(
asList(CONDITION),
asList(CONDITION, CONDITION_NOT_BETWEEN_SYMMETRIC),
@ -840,10 +880,44 @@ public class VisitContextTest extends AbstractTest {
asList(CONDITION, CONDITION_NOT_BETWEEN_SYMMETRIC, FIELD_ROW, FIELD, FIELD_VALUE),
asList(CONDITION, CONDITION_NOT_BETWEEN_SYMMETRIC, FIELD_ROW, FIELD),
asList(CONDITION, CONDITION_NOT_BETWEEN_SYMMETRIC, FIELD_ROW, FIELD, FIELD_VALUE)
));
),
row(FIELD_ID1, FIELD_NAME1).notBetweenSymmetric(1, "a").and(2, "b"));
}
private void assertEvents(List<List<Clause>> expected) {
private RenderContext r_ctx() {
return ctx.renderContext();
}
private BindContext b_ctx() {
MockDataProvider p = new MockDataProvider() {
@Override
public MockResult[] execute(MockExecuteContext c) throws SQLException {
return new MockResult[0];
}
};
return ctx.bindContext(new MockStatement(new MockConnection(p), p));
}
private void assertEvents(List<List<Clause>> expected, QueryPart part) {
assertEvents(expected, part, r_ctx(), b_ctx());
}
private void assertEvents(List<List<Clause>> expected, QueryPart part, RenderContext r_ctx, BindContext b_ctx) {
listener.clauses.clear();
r_ctx.visit(part);
assertEvents0(expected);
// TODO: Re-enable this once bind variable visiting is implemented
if (false) {
listener.clauses.clear();
b_ctx.visit(part);
assertEvents0(expected);
}
}
private void assertEvents0(List<List<Clause>> expected) {
// This assertion is a bit more verbose to be able to detect errors more easily
for (int i = 0; i < expected.size() && i < listener.clauses.size(); i++) {
assertEquals("Mismatch at position " + i + ":", expected.get(i), listener.clauses.get(i));