Merge pull request #2273 from querydsl/querydsl-4.2.0-fixes

Fixes for release
This commit is contained in:
Timo Westkämper 2018-03-20 18:47:34 +02:00 committed by GitHub
commit 39fc342d59
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 75 additions and 55 deletions

16
pom.xml
View File

@ -284,7 +284,23 @@
<rules>
<requireBackwardCompatibility implementation="org.semver.enforcer.RequireBackwardCompatibility">
<excludes>
<exclude>com/querydsl/core/Fetchable</exclude>
<exclude>com/querydsl/core/types/dsl/PathBuilderValidator</exclude>
<exclude>com/querydsl/collections/AbstractCollQuery</exclude>
<exclude>com/querydsl/hibernate/search/AbstractSearchQuery</exclude>
<exclude>com/querydsl/jdo/AbstractJDOQuery</exclude>
<exclude>com/querydsl/jdo/sql/AbstractSQLQuery</exclude>
<exclude>com/querydsl/jpa/hibernate/AbstractHibernateQuery</exclude>
<exclude>com/querydsl/jpa/JPASubQuery</exclude>
<exclude>com/querydsl/jpa/hibernate/sql/AbstractHibernateSQLQuery</exclude>
<exclude>com/querydsl/jpa/impl/AbstractJPAQuery</exclude>
<exclude>com/querydsl/jpa/sql/AbstractJPASQLQuery</exclude>
<exclude>com/querydsl/lucene3/AbstractLuceneQuery</exclude>
<exclude>com/querydsl/lucene4/AbstractLuceneQuery</exclude>
<exclude>com/querydsl/lucene5/AbstractLuceneQuery</exclude>
<exclude>com/querydsl/mongodb/AbstractMongodbQuery</exclude>
<exclude>com/querydsl/sql/ProjectableSQLQuery</exclude>
<exclude>com/querydsl/sql/UnionImpl</exclude>
<exclude>com/querydsl/sql/Union</exclude>
<exclude>com/querydsl/sql/SQLListenerContextImpl</exclude>
<exclude>com/querydsl/sql/dml/SQLDeleteClause</exclude>

View File

@ -32,4 +32,8 @@ public class NonUniqueResultException extends QueryException {
super(message);
}
public NonUniqueResultException(Exception e) {
super(e);
}
}

View File

@ -84,7 +84,7 @@ public abstract class AbstractSQLDeleteClause<C extends AbstractSQLDeleteClause<
* @param flag query flag
* @return the current object
*/
@WithBridgeMethods(SQLDeleteClause.class)
@WithBridgeMethods(value = SQLDeleteClause.class, castRequired = true)
public C addFlag(Position position, String flag) {
metadata.addFlag(new QueryFlag(position, flag));
return (C) this;
@ -97,7 +97,7 @@ public abstract class AbstractSQLDeleteClause<C extends AbstractSQLDeleteClause<
* @param flag query flag
* @return the current object
*/
@WithBridgeMethods(SQLDeleteClause.class)
@WithBridgeMethods(value = SQLDeleteClause.class, castRequired = true)
public C addFlag(Position position, Expression<?> flag) {
metadata.addFlag(new QueryFlag(position, flag));
return (C) this;
@ -108,7 +108,7 @@ public abstract class AbstractSQLDeleteClause<C extends AbstractSQLDeleteClause<
*
* @return the current object
*/
@WithBridgeMethods(SQLDeleteClause.class)
@WithBridgeMethods(value = SQLDeleteClause.class, castRequired = true)
public C addBatch() {
batches.add(metadata);
metadata = new DefaultQueryMetadata();
@ -250,14 +250,14 @@ public abstract class AbstractSQLDeleteClause<C extends AbstractSQLDeleteClause<
}
}
@WithBridgeMethods(SQLDeleteClause.class)
@WithBridgeMethods(value = SQLDeleteClause.class, castRequired = true)
public C where(Predicate p) {
metadata.addWhere(p);
return (C) this;
}
@Override
@WithBridgeMethods(SQLDeleteClause.class)
@WithBridgeMethods(value = SQLDeleteClause.class, castRequired = true)
public C where(Predicate... o) {
for (Predicate p : o) {
metadata.addWhere(p);
@ -265,7 +265,7 @@ public abstract class AbstractSQLDeleteClause<C extends AbstractSQLDeleteClause<
return (C) this;
}
@WithBridgeMethods(SQLDeleteClause.class)
@WithBridgeMethods(value = SQLDeleteClause.class, castRequired = true)
public C limit(@Nonnegative long limit) {
metadata.setModifiers(QueryModifiers.limit(limit));
return (C) this;

View File

@ -98,7 +98,7 @@ public abstract class AbstractSQLInsertClause<C extends AbstractSQLInsertClause<
* @param flag query flag
* @return the current object
*/
@WithBridgeMethods(SQLInsertClause.class)
@WithBridgeMethods(value = SQLInsertClause.class, castRequired = true)
public C addFlag(Position position, String flag) {
metadata.addFlag(new QueryFlag(position, flag));
return (C) this;
@ -111,7 +111,7 @@ public abstract class AbstractSQLInsertClause<C extends AbstractSQLInsertClause<
* @param flag query flag
* @return the current object
*/
@WithBridgeMethods(SQLInsertClause.class)
@WithBridgeMethods(value = SQLInsertClause.class, castRequired = true)
public C addFlag(Position position, Expression<?> flag) {
metadata.addFlag(new QueryFlag(position, flag));
return (C) this;
@ -122,7 +122,7 @@ public abstract class AbstractSQLInsertClause<C extends AbstractSQLInsertClause<
*
* @return the current object
*/
@WithBridgeMethods(SQLInsertClause.class)
@WithBridgeMethods(value = SQLInsertClause.class, castRequired = true)
public C addBatch() {
if (subQueryBuilder != null) {
subQuery = subQueryBuilder.select(values.toArray(new Expression[values.size()])).clone();
@ -152,7 +152,7 @@ public abstract class AbstractSQLInsertClause<C extends AbstractSQLInsertClause<
}
@Override
@WithBridgeMethods(SQLInsertClause.class)
@WithBridgeMethods(value = SQLInsertClause.class, castRequired = true)
public C columns(Path<?>... columns) {
this.columns.addAll(Arrays.asList(columns));
return (C) this;
@ -468,7 +468,7 @@ public abstract class AbstractSQLInsertClause<C extends AbstractSQLInsertClause<
}
@Override
@WithBridgeMethods(SQLInsertClause.class)
@WithBridgeMethods(value = SQLInsertClause.class, castRequired = true)
public C select(SubQueryExpression<?> sq) {
subQuery = sq;
for (Map.Entry<ParamExpression<?>, Object> entry : sq.getMetadata().getParams().entrySet()) {
@ -478,7 +478,7 @@ public abstract class AbstractSQLInsertClause<C extends AbstractSQLInsertClause<
}
@Override
@WithBridgeMethods(SQLInsertClause.class)
@WithBridgeMethods(value = SQLInsertClause.class, castRequired = true)
public <T> C set(Path<T> path, T value) {
columns.add(path);
if (value instanceof Expression<?>) {
@ -492,7 +492,7 @@ public abstract class AbstractSQLInsertClause<C extends AbstractSQLInsertClause<
}
@Override
@WithBridgeMethods(SQLInsertClause.class)
@WithBridgeMethods(value = SQLInsertClause.class, castRequired = true)
public <T> C set(Path<T> path, Expression<? extends T> expression) {
columns.add(path);
values.add(expression);
@ -500,7 +500,7 @@ public abstract class AbstractSQLInsertClause<C extends AbstractSQLInsertClause<
}
@Override
@WithBridgeMethods(SQLInsertClause.class)
@WithBridgeMethods(value = SQLInsertClause.class, castRequired = true)
public <T> C setNull(Path<T> path) {
columns.add(path);
values.add(Null.CONSTANT);
@ -508,7 +508,7 @@ public abstract class AbstractSQLInsertClause<C extends AbstractSQLInsertClause<
}
@Override
@WithBridgeMethods(SQLInsertClause.class)
@WithBridgeMethods(value = SQLInsertClause.class, castRequired = true)
public C values(Object... v) {
for (Object value : v) {
if (value instanceof Expression<?>) {
@ -540,7 +540,7 @@ public abstract class AbstractSQLInsertClause<C extends AbstractSQLInsertClause<
* @param bean bean to use for population
* @return the current object
*/
@WithBridgeMethods(SQLInsertClause.class)
@WithBridgeMethods(value = SQLInsertClause.class, castRequired = true)
public C populate(Object bean) {
return populate(bean, DefaultMapper.DEFAULT);
}
@ -554,7 +554,7 @@ public abstract class AbstractSQLInsertClause<C extends AbstractSQLInsertClause<
* @return the current object
*/
@SuppressWarnings("rawtypes")
@WithBridgeMethods(SQLInsertClause.class)
@WithBridgeMethods(value = SQLInsertClause.class, castRequired = true)
public <T> C populate(T obj, Mapper<T> mapper) {
Map<Path<?>, Object> values = mapper.createMap(entity, obj);
for (Map.Entry<Path<?>, Object> entry : values.entrySet()) {

View File

@ -82,7 +82,7 @@ public abstract class AbstractSQLUpdateClause<C extends AbstractSQLUpdateClause<
* @param flag query flag
* @return the current object
*/
@WithBridgeMethods(SQLUpdateClause.class)
@WithBridgeMethods(value = SQLUpdateClause.class, castRequired = true)
public C addFlag(Position position, String flag) {
metadata.addFlag(new QueryFlag(position, flag));
return (C) this;
@ -95,7 +95,7 @@ public abstract class AbstractSQLUpdateClause<C extends AbstractSQLUpdateClause<
* @param flag query flag
* @return the current object
*/
@WithBridgeMethods(SQLUpdateClause.class)
@WithBridgeMethods(value = SQLUpdateClause.class, castRequired = true)
public C addFlag(Position position, Expression<?> flag) {
metadata.addFlag(new QueryFlag(position, flag));
return (C) this;
@ -106,7 +106,7 @@ public abstract class AbstractSQLUpdateClause<C extends AbstractSQLUpdateClause<
*
* @return the current object
*/
@WithBridgeMethods(SQLUpdateClause.class)
@WithBridgeMethods(value = SQLUpdateClause.class, castRequired = true)
public C addBatch() {
batches.add(new SQLUpdateBatch(metadata, updates));
updates = Maps.newLinkedHashMap();
@ -249,7 +249,7 @@ public abstract class AbstractSQLUpdateClause<C extends AbstractSQLUpdateClause<
}
@Override
@WithBridgeMethods(SQLUpdateClause.class)
@WithBridgeMethods(value = SQLUpdateClause.class, castRequired = true)
public <T> C set(Path<T> path, T value) {
if (value instanceof Expression<?>) {
updates.put(path, (Expression<?>) value);
@ -262,7 +262,7 @@ public abstract class AbstractSQLUpdateClause<C extends AbstractSQLUpdateClause<
}
@Override
@WithBridgeMethods(SQLUpdateClause.class)
@WithBridgeMethods(value = SQLUpdateClause.class, castRequired = true)
public <T> C set(Path<T> path, Expression<? extends T> expression) {
if (expression != null) {
updates.put(path, expression);
@ -273,14 +273,14 @@ public abstract class AbstractSQLUpdateClause<C extends AbstractSQLUpdateClause<
}
@Override
@WithBridgeMethods(SQLUpdateClause.class)
@WithBridgeMethods(value = SQLUpdateClause.class, castRequired = true)
public <T> C setNull(Path<T> path) {
updates.put(path, Null.CONSTANT);
return (C) this;
}
@Override
@WithBridgeMethods(SQLUpdateClause.class)
@WithBridgeMethods(value = SQLUpdateClause.class, castRequired = true)
public C set(List<? extends Path<?>> paths, List<?> values) {
for (int i = 0; i < paths.size(); i++) {
if (values.get(i) instanceof Expression) {
@ -294,14 +294,14 @@ public abstract class AbstractSQLUpdateClause<C extends AbstractSQLUpdateClause<
return (C) this;
}
@WithBridgeMethods(SQLUpdateClause.class)
@WithBridgeMethods(value = SQLUpdateClause.class, castRequired = true)
public C where(Predicate p) {
metadata.addWhere(p);
return (C) this;
}
@Override
@WithBridgeMethods(SQLUpdateClause.class)
@WithBridgeMethods(value = SQLUpdateClause.class, castRequired = true)
public C where(Predicate... o) {
for (Predicate p : o) {
metadata.addWhere(p);
@ -309,7 +309,7 @@ public abstract class AbstractSQLUpdateClause<C extends AbstractSQLUpdateClause<
return (C) this;
}
@WithBridgeMethods(SQLUpdateClause.class)
@WithBridgeMethods(value = SQLUpdateClause.class, castRequired = true)
public C limit(@Nonnegative long limit) {
metadata.setModifiers(QueryModifiers.limit(limit));
return (C) this;
@ -331,7 +331,7 @@ public abstract class AbstractSQLUpdateClause<C extends AbstractSQLUpdateClause<
* @return the current object
*/
@SuppressWarnings("unchecked")
@WithBridgeMethods(SQLUpdateClause.class)
@WithBridgeMethods(value = SQLUpdateClause.class, castRequired = true)
public C populate(Object bean) {
return populate(bean, DefaultMapper.DEFAULT);
}
@ -344,7 +344,7 @@ public abstract class AbstractSQLUpdateClause<C extends AbstractSQLUpdateClause<
* @return the current object
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
@WithBridgeMethods(SQLUpdateClause.class)
@WithBridgeMethods(value = SQLUpdateClause.class, castRequired = true)
public <T> C populate(T obj, Mapper<T> mapper) {
Collection<? extends Path<?>> primaryKeyColumns = entity.getPrimaryKey() != null
? entity.getPrimaryKey().getLocalColumns()

View File

@ -46,7 +46,7 @@ public abstract class AbstractSQLServerQuery<T, C extends AbstractSQLServerQuery
* @param tableHints table hints
* @return the current object
*/
@WithBridgeMethods(SQLServerQuery.class)
@WithBridgeMethods(value = SQLServerQuery.class, castRequired = true)
public C tableHints(SQLServerTableHints... tableHints) {
if (tableHints.length > 0) {
String hints = SQLServerGrammar.tableHints(tableHints);

View File

@ -73,7 +73,7 @@ public abstract class AbstractMySQLQuery<T, C extends AbstractMySQLQuery<T, C>>
*
* @return the current object
*/
@WithBridgeMethods(MySQLQuery.class)
@WithBridgeMethods(value = MySQLQuery.class, castRequired = true)
public C bigResult() {
return addFlag(Position.AFTER_SELECT, SQL_BIG_RESULT);
}
@ -86,7 +86,7 @@ public abstract class AbstractMySQLQuery<T, C extends AbstractMySQLQuery<T, C>>
*
* @return the current object
*/
@WithBridgeMethods(MySQLQuery.class)
@WithBridgeMethods(value = MySQLQuery.class, castRequired = true)
public C bufferResult() {
return addFlag(Position.AFTER_SELECT, SQL_BUFFER_RESULT);
}
@ -97,7 +97,7 @@ public abstract class AbstractMySQLQuery<T, C extends AbstractMySQLQuery<T, C>>
*
* @return the current object
*/
@WithBridgeMethods(MySQLQuery.class)
@WithBridgeMethods(value = MySQLQuery.class, castRequired = true)
public C cache() {
return addFlag(Position.AFTER_SELECT, SQL_CACHE);
}
@ -108,7 +108,7 @@ public abstract class AbstractMySQLQuery<T, C extends AbstractMySQLQuery<T, C>>
*
* @return the current object
*/
@WithBridgeMethods(MySQLQuery.class)
@WithBridgeMethods(value = MySQLQuery.class, castRequired = true)
public C calcFoundRows() {
return addFlag(Position.AFTER_SELECT, SQL_CALC_FOUND_ROWS);
}
@ -119,7 +119,7 @@ public abstract class AbstractMySQLQuery<T, C extends AbstractMySQLQuery<T, C>>
*
* @return the current object
*/
@WithBridgeMethods(MySQLQuery.class)
@WithBridgeMethods(value = MySQLQuery.class, castRequired = true)
public C highPriority() {
return addFlag(Position.AFTER_SELECT, HIGH_PRIORITY);
}
@ -130,7 +130,7 @@ public abstract class AbstractMySQLQuery<T, C extends AbstractMySQLQuery<T, C>>
* @param var variable name
* @return the current object
*/
@WithBridgeMethods(MySQLQuery.class)
@WithBridgeMethods(value = MySQLQuery.class, castRequired = true)
public C into(String var) {
return addFlag(Position.END, "\ninto " + var);
}
@ -141,7 +141,7 @@ public abstract class AbstractMySQLQuery<T, C extends AbstractMySQLQuery<T, C>>
* @param file file to write to
* @return the current object
*/
@WithBridgeMethods(MySQLQuery.class)
@WithBridgeMethods(value = MySQLQuery.class, castRequired = true)
public C intoDumpfile(File file) {
return addFlag(Position.END, "\ninto dumpfile '" + file.getPath() + "'");
}
@ -153,7 +153,7 @@ public abstract class AbstractMySQLQuery<T, C extends AbstractMySQLQuery<T, C>>
* @param file file to write to
* @return the current object
*/
@WithBridgeMethods(MySQLQuery.class)
@WithBridgeMethods(value = MySQLQuery.class, castRequired = true)
public C intoOutfile(File file) {
return addFlag(Position.END, "\ninto outfile '" + file.getPath() + "'");
}
@ -164,7 +164,7 @@ public abstract class AbstractMySQLQuery<T, C extends AbstractMySQLQuery<T, C>>
*
* @return the current object
*/
@WithBridgeMethods(MySQLQuery.class)
@WithBridgeMethods(value = MySQLQuery.class, castRequired = true)
public C lockInShareMode() {
return addFlag(Position.END, LOCK_IN_SHARE_MODE);
}
@ -175,7 +175,7 @@ public abstract class AbstractMySQLQuery<T, C extends AbstractMySQLQuery<T, C>>
*
* @return the current object
*/
@WithBridgeMethods(MySQLQuery.class)
@WithBridgeMethods(value = MySQLQuery.class, castRequired = true)
public C noCache() {
return addFlag(Position.AFTER_SELECT, SQL_NO_CACHE);
}
@ -186,7 +186,7 @@ public abstract class AbstractMySQLQuery<T, C extends AbstractMySQLQuery<T, C>>
*
* @return the current object
*/
@WithBridgeMethods(MySQLQuery.class)
@WithBridgeMethods(value = MySQLQuery.class, castRequired = true)
public C smallResult() {
return addFlag(Position.AFTER_SELECT, SQL_SMALL_RESULT);
}
@ -198,7 +198,7 @@ public abstract class AbstractMySQLQuery<T, C extends AbstractMySQLQuery<T, C>>
*
* @return the current object
*/
@WithBridgeMethods(MySQLQuery.class)
@WithBridgeMethods(value = MySQLQuery.class, castRequired = true)
public C straightJoin() {
return addFlag(Position.AFTER_SELECT, STRAIGHT_JOIN);
}
@ -211,7 +211,7 @@ public abstract class AbstractMySQLQuery<T, C extends AbstractMySQLQuery<T, C>>
* @param indexes index names
* @return the current object
*/
@WithBridgeMethods(MySQLQuery.class)
@WithBridgeMethods(value = MySQLQuery.class, castRequired = true)
public C forceIndex(String... indexes) {
return addJoinFlag(" force index (" + JOINER.join(indexes) + ")", JoinFlag.Position.END);
}
@ -223,7 +223,7 @@ public abstract class AbstractMySQLQuery<T, C extends AbstractMySQLQuery<T, C>>
* @param indexes index names
* @return the current object
*/
@WithBridgeMethods(MySQLQuery.class)
@WithBridgeMethods(value = MySQLQuery.class, castRequired = true)
public C ignoreIndex(String... indexes) {
return addJoinFlag(" ignore index (" + JOINER.join(indexes) + ")", JoinFlag.Position.END);
}
@ -235,7 +235,7 @@ public abstract class AbstractMySQLQuery<T, C extends AbstractMySQLQuery<T, C>>
* @param indexes index names
* @return the current object
*/
@WithBridgeMethods(MySQLQuery.class)
@WithBridgeMethods(value = MySQLQuery.class, castRequired = true)
public C useIndex(String... indexes) {
return addJoinFlag(" use index (" + JOINER.join(indexes) + ")", JoinFlag.Position.END);
}
@ -248,7 +248,7 @@ public abstract class AbstractMySQLQuery<T, C extends AbstractMySQLQuery<T, C>>
*
* @return the current object
*/
@WithBridgeMethods(MySQLQuery.class)
@WithBridgeMethods(value = MySQLQuery.class, castRequired = true)
public C withRollup() {
return addFlag(Position.AFTER_GROUP_BY, WITH_ROLLUP);
}

View File

@ -58,7 +58,7 @@ public abstract class AbstractOracleQuery<T, C extends AbstractOracleQuery<T, C>
* @param cond condition
* @return the current object
*/
@WithBridgeMethods(OracleQuery.class)
@WithBridgeMethods(value = OracleQuery.class, castRequired = true)
public C connectByPrior(Predicate cond) {
return addFlag(Position.BEFORE_ORDER, CONNECT_BY_PRIOR, cond);
}
@ -69,7 +69,7 @@ public abstract class AbstractOracleQuery<T, C extends AbstractOracleQuery<T, C>
* @param cond condition
* @return the current object
*/
@WithBridgeMethods(OracleQuery.class)
@WithBridgeMethods(value = OracleQuery.class, castRequired = true)
public C connectBy(Predicate cond) {
return addFlag(Position.BEFORE_ORDER, CONNECT_BY, cond);
}
@ -80,7 +80,7 @@ public abstract class AbstractOracleQuery<T, C extends AbstractOracleQuery<T, C>
* @param cond condition
* @return the current object
*/
@WithBridgeMethods(OracleQuery.class)
@WithBridgeMethods(value = OracleQuery.class, castRequired = true)
public C connectByNocyclePrior(Predicate cond) {
return addFlag(Position.BEFORE_ORDER, CONNECT_BY_NOCYCLE_PRIOR, cond);
}
@ -91,7 +91,7 @@ public abstract class AbstractOracleQuery<T, C extends AbstractOracleQuery<T, C>
* @param cond condition
* @return the current object
*/
@WithBridgeMethods(OracleQuery.class)
@WithBridgeMethods(value = OracleQuery.class, castRequired = true)
public <A> C startWith(Predicate cond) {
return addFlag(Position.BEFORE_ORDER, START_WITH, cond);
}
@ -103,7 +103,7 @@ public abstract class AbstractOracleQuery<T, C extends AbstractOracleQuery<T, C>
* @param path path
* @return the current object
*/
@WithBridgeMethods(OracleQuery.class)
@WithBridgeMethods(value = OracleQuery.class, castRequired = true)
public C orderSiblingsBy(Expression<?> path) {
return addFlag(Position.BEFORE_ORDER, ORDER_SIBLINGS_BY, path);
}

View File

@ -52,7 +52,7 @@ public abstract class AbstractPostgreSQLQuery<T, C extends AbstractPostgreSQLQue
*
* @return the current object
*/
@WithBridgeMethods(PostgreSQLQuery.class)
@WithBridgeMethods(value = PostgreSQLQuery.class, castRequired = true)
public C forShare() {
// global forShare support was added later, delegating to super implementation
return super.forShare();
@ -64,7 +64,7 @@ public abstract class AbstractPostgreSQLQuery<T, C extends AbstractPostgreSQLQue
*
* @return the current object
*/
@WithBridgeMethods(PostgreSQLQuery.class)
@WithBridgeMethods(value = PostgreSQLQuery.class, castRequired = true)
public C noWait() {
QueryFlag noWaitFlag = configuration.getTemplates().getNoWaitFlag();
return addFlag(noWaitFlag);
@ -76,7 +76,7 @@ public abstract class AbstractPostgreSQLQuery<T, C extends AbstractPostgreSQLQue
* @param paths tables
* @return the current object
*/
@WithBridgeMethods(PostgreSQLQuery.class)
@WithBridgeMethods(value = PostgreSQLQuery.class, castRequired = true)
public C of(RelationalPath<?>... paths) {
StringBuilder builder = new StringBuilder(" of ");
for (RelationalPath<?> path : paths) {
@ -94,7 +94,7 @@ public abstract class AbstractPostgreSQLQuery<T, C extends AbstractPostgreSQLQue
* @param exprs
* @return
*/
@WithBridgeMethods(PostgreSQLQuery.class)
@WithBridgeMethods(value = PostgreSQLQuery.class, castRequired = true)
public C distinctOn(Expression<?>... exprs) {
return addFlag(Position.AFTER_SELECT,
Expressions.template(Object.class, "distinct on({0}) ",