diff --git a/api/src/org/labkey/api/data/CompareType.java b/api/src/org/labkey/api/data/CompareType.java index 206040415c7..311311bdeaf 100644 --- a/api/src/org/labkey/api/data/CompareType.java +++ b/api/src/org/labkey/api/data/CompareType.java @@ -1003,6 +1003,10 @@ public Pair getSqlFragments(Map columnMap, SqlDialect dialect) { ColumnInfo colInfo = columnMap != null ? columnMap.get(_fieldKey) : null; + + if (colInfo != null && colInfo.getJdbcType() != JdbcType.ARRAY) + throw new RuntimeSQLException(new SQLGenerationException("Invalid filter type for column '" + _fieldKey.toDisplayString() + "'.")); + var alias = SimpleFilter.getAliasForColumnFilter(dialect, colInfo, _fieldKey); SQLFragment columnFragment = new SQLFragment().appendIdentifier(alias); @@ -1747,6 +1755,9 @@ protected String toURLParamValue() public SQLFragment toSQLFragment(Map columnMap, SqlDialect dialect) { ColumnInfo colInfo = columnMap != null ? columnMap.get(_fieldKey) : null; + if (colInfo != null && colInfo.getJdbcType() == JdbcType.ARRAY) + throw new RuntimeSQLException(new SQLGenerationException("Invalid filter type for column '" + _fieldKey.toDisplayString() + "'.")); + var alias = SimpleFilter.getAliasForColumnFilter(dialect, colInfo, _fieldKey); SQLFragment fragment = toWhereClause(dialect, alias); diff --git a/api/src/org/labkey/api/data/DataRegion.java b/api/src/org/labkey/api/data/DataRegion.java index 94930e050d5..43e66f0f5f3 100644 --- a/api/src/org/labkey/api/data/DataRegion.java +++ b/api/src/org/labkey/api/data/DataRegion.java @@ -2654,7 +2654,7 @@ private void prepareFilters(RenderContext ctx) StringBuilder msg; if (ignoredColumns.size() == 1) { - msg = new StringBuilder("Ignoring filter/sort on column '" + ignoredColumns.iterator().next().toDisplayString() + "' because it does not exist."); + msg = new StringBuilder("Ignoring filter/sort on column '" + ignoredColumns.iterator().next().toDisplayString() + "' because it does not exist or the filter type is invalid."); } else { @@ -2666,7 +2666,7 @@ private void prepareFilters(RenderContext ctx) sep = ", "; msg.append("'").append(fieldKey.toDisplayString()).append("'"); } - msg.append(" because they do not exist."); + msg.append(" because they do not exist or the filter types are invalid."); } addMessage(new Message(msg.toString(), MessageType.WARNING, "filter")); diff --git a/query/src/org/labkey/query/QueryServiceImpl.java b/query/src/org/labkey/query/QueryServiceImpl.java index ecf58bc27d8..beca1695766 100644 --- a/query/src/org/labkey/query/QueryServiceImpl.java +++ b/query/src/org/labkey/query/QueryServiceImpl.java @@ -33,6 +33,7 @@ import org.json.JSONObject; import org.junit.Assert; import org.junit.Test; +import org.labkey.api.action.ApiUsageException; import org.labkey.api.assay.AssayService; import org.labkey.api.audit.AbstractAuditHandler; import org.labkey.api.audit.AuditHandler; @@ -1902,7 +1903,7 @@ public List ensureRequiredColumns(@NotNull TableInfo table, @NotNull continue; for (FieldKey fieldKey : set) { - ColumnInfo col = resolveFieldKey(fieldKey, table, columnMap, unresolvedColumns, manager); + ColumnInfo col = resolveFieldKey(fieldKey, table, columnMap, unresolvedColumns, manager, null); if (col != null) ret.putIfAbsent(col.getFieldKey(),col); } @@ -1911,11 +1912,29 @@ public List ensureRequiredColumns(@NotNull TableInfo table, @NotNull if (filter != null) { - for (FieldKey fieldKey : filter.getWhereParamFieldKeys()) + if (filter instanceof SimpleFilter simpleFilter) { - ColumnInfo col = resolveFieldKey(fieldKey, table, columnMap, unresolvedColumns, manager); - if (col != null) - ret.putIfAbsent(col.getFieldKey(),col); + Map> clausesByField = new HashMap<>(); + for (SimpleFilter.FilterClause clause : simpleFilter.getClauses()) + { + for (FieldKey fk : clause.getFieldKeys()) + clausesByField.computeIfAbsent(fk, k -> new ArrayList<>()).add(clause); + } + for (FieldKey fieldKey : simpleFilter.getWhereParamFieldKeys()) + { + ColumnInfo col = resolveFieldKey(fieldKey, table, columnMap, unresolvedColumns, manager, clausesByField.get(fieldKey)); + if (col != null) + ret.putIfAbsent(col.getFieldKey(), col); + } + } + else + { + for (FieldKey fieldKey : filter.getWhereParamFieldKeys()) + { + ColumnInfo col = resolveFieldKey(fieldKey, table, columnMap, unresolvedColumns, manager, null); + if (col != null) + ret.putIfAbsent(col.getFieldKey(), col); + } } } @@ -1923,7 +1942,7 @@ public List ensureRequiredColumns(@NotNull TableInfo table, @NotNull { for (Sort.SortField field : sort.getSortList()) { - ColumnInfo col = resolveFieldKey(field.getFieldKey(), table, columnMap, unresolvedColumns, manager); + ColumnInfo col = resolveFieldKey(field.getFieldKey(), table, columnMap, unresolvedColumns, manager, null); if (col != null) { ret.putIfAbsent(col.getFieldKey(),col); @@ -1970,7 +1989,7 @@ private void resolveSortColumns(ColumnInfo col, Map column for (FieldKey key : sortFieldKeys) { - ColumnInfo sortCol = resolveFieldKey(key, col.getParentTable(), columnMap, null, manager); + ColumnInfo sortCol = resolveFieldKey(key, col.getParentTable(), columnMap, null, manager, null); if (sortCol != null) { toAdd.add(sortCol); @@ -2002,7 +2021,7 @@ private void resolveSortColumns(ColumnInfo col, Map column } } - private ColumnInfo resolveFieldKey(FieldKey fieldKey, TableInfo table, Map columnMap, Set unresolvedColumns, AliasManager manager) + private ColumnInfo resolveFieldKey(FieldKey fieldKey, TableInfo table, Map columnMap, Set unresolvedColumns, AliasManager manager, @Nullable List filterClauses) { if (fieldKey == null) // TODO: Can this resolve "selectionMethods/selectionMethodId$Sname"? return null; @@ -2030,6 +2049,21 @@ private ColumnInfo resolveFieldKey(FieldKey fieldKey, TableInfo table, Map