Add InTuples expression for multi-column IN expression

This commit is contained in:
Rob Bygrave
2023-07-03 11:49:53 +12:00
parent d99c50da75
commit e952b555e0
11 changed files with 311 additions and 0 deletions
@@ -0,0 +1,62 @@
package io.ebean;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
*
*/
final class DInTuples implements InTuples {
private final String[] properties;
private final List<Entry> entries = new ArrayList<>();
DInTuples(String[] properties) {
this.properties = properties;
}
/**
*/
@Override
public InTuples add(Object... values) {
entries.add(new DEntry(values));
return this;
}
/**
* Return the first property name.
*/
@Override
public String[] properties() {
return properties;
}
/**
* Return all the value pairs.
*/
@Override
public List<Entry> entries() {
return Collections.unmodifiableList(entries);
}
/**
* A pair of 2 value objects.
* <p>
* Used to support inPairs() expression.
*/
static final class DEntry implements InTuples.Entry {
private final Object[] vals;
DEntry(Object[] vals) {
this.vals = vals;
}
@Override
public Object[] values() {
return vals;
}
}
}
@@ -369,6 +369,11 @@ public interface ExpressionFactory {
*/
Expression inPairs(Pairs pairs);
/**
* In expression using multiple columns.
*/
Expression inTuples(InTuples pairs);
/**
* In - property has a value in the array of values.
*/
@@ -1131,6 +1131,11 @@ public interface ExpressionList<T> {
*/
ExpressionList<T> inPairs(Pairs pairs);
/**
* In expression using multiple columns.
*/
ExpressionList<T> inTuples(InTuples pairs);
/**
* EXISTS a raw SQL SubQuery.
*
@@ -0,0 +1,56 @@
package io.ebean;
import java.util.List;
/**
* IN expression using multiple columns.
* <p>
* Produces SQL expression in the form of (A,B,C) IN ((a0,b0,c0), (a1,b1,c1), ... )
* where A,B,C are the properties in the tuples.
*/
public interface InTuples {
/**
* Create given the properties in the tuples.
*/
static InTuples of(String... properties) {
return new DInTuples(properties);
}
/**
* Create given the properties in the tuples.
*/
static InTuples of(Query.Property<?>... properties) {
String[] props = new String[properties.length];
for (int i = 0; i < properties.length; i++) {
props[i] = properties[i].toString();
}
return new DInTuples(props);
}
/**
* Add a tuple entry.
*/
InTuples add(Object... values);
/**
* Return the properties of the tuples.
*/
String[] properties();
/**
* Return all the tuple entries.
*/
List<Entry> entries();
/**
* A tuple entry.
*/
interface Entry {
/**
* Return all the values for this entry.
*/
Object[] values();
}
}