Commit fbf2d3efdbd66a3cf5f1513439fe220c1c5cdeec

Authored by Viacheslav Klimov
Committed by GitHub
1 parent e618f238

Fix entities filtering by kv when search value is empty (#4515)

* Fix entities filtering by kv when search value is empty

* Refactor
... ... @@ -243,23 +243,21 @@ public class EntityKeyMapping {
243 243 } else {
244 244 entityTypeStr = "'" + entityType.name() + "'";
245 245 }
246   - ctx.addStringParameter(alias + "_key_id", entityKey.getKey());
  246 + ctx.addStringParameter(getKeyId(), entityKey.getKey());
247 247 String filterQuery = toQueries(ctx, entityFilter.getType())
248 248 .filter(StringUtils::isNotEmpty)
249 249 .collect(Collectors.joining(" and "));
250   - if (StringUtils.isEmpty(filterQuery)) {
251   - filterQuery = "";
252   - } else {
  250 + if (StringUtils.isNotEmpty(filterQuery)) {
253 251 filterQuery = " AND (" + filterQuery + ")";
254 252 }
255 253 if (entityKey.getType().equals(EntityKeyType.TIME_SERIES)) {
256   - String join = hasFilter() ? "inner join" : "left join";
  254 + String join = (hasFilter() && hasFilterValues(ctx)) ? "inner join" : "left join";
257 255 return String.format("%s ts_kv_latest %s ON %s.entity_id=entities.id AND %s.key = (select key_id from ts_kv_dictionary where key = :%s_key_id) %s",
258 256 join, alias, alias, alias, alias, filterQuery);
259 257 } else {
260 258 String query;
261 259 if (!entityKey.getType().equals(EntityKeyType.ATTRIBUTE)) {
262   - String join = hasFilter() ? "inner join" : "left join";
  260 + String join = (hasFilter() && hasFilterValues(ctx)) ? "inner join" : "left join";
263 261 query = String.format("%s attribute_kv %s ON %s.entity_id=entities.id AND %s.entity_type=%s AND %s.attribute_key=:%s_key_id ",
264 262 join, alias, alias, alias, entityTypeStr, alias, alias);
265 263 String scope;
... ... @@ -272,7 +270,7 @@ public class EntityKeyMapping {
272 270 }
273 271 query = String.format("%s AND %s.attribute_type='%s' %s", query, alias, scope, filterQuery);
274 272 } else {
275   - String join = hasFilter() ? "join LATERAL" : "left join LATERAL";
  273 + String join = (hasFilter() && hasFilterValues(ctx)) ? "join LATERAL" : "left join LATERAL";
276 274 query = String.format("%s (select * from attribute_kv %s WHERE %s.entity_id=entities.id AND %s.entity_type=%s AND %s.attribute_key=:%s_key_id %s " +
277 275 "ORDER BY %s.last_update_ts DESC limit 1) as %s ON true",
278 276 join, alias, alias, alias, entityTypeStr, alias, alias, filterQuery, alias, alias);
... ... @@ -281,15 +279,26 @@ public class EntityKeyMapping {
281 279 }
282 280 }
283 281
  282 + private boolean hasFilterValues(QueryContext ctx) {
  283 + return Arrays.stream(ctx.getParameterNames()).anyMatch(parameterName -> {
  284 + return !parameterName.equals(getKeyId()) && parameterName.startsWith(alias);
  285 + });
  286 + }
  287 +
  288 + private String getKeyId() {
  289 + return alias + "_key_id";
  290 + }
  291 +
284 292 public static String buildSelections(List<EntityKeyMapping> mappings, EntityFilterType filterType, EntityType entityType) {
285 293 return mappings.stream().map(mapping -> mapping.toSelection(filterType, entityType)).collect(
286 294 Collectors.joining(", "));
287 295 }
288 296
289 297 public static String buildLatestJoins(QueryContext ctx, EntityFilter entityFilter, EntityType entityType, List<EntityKeyMapping> latestMappings, boolean countQuery) {
290   - return latestMappings.stream().filter(mapping -> !countQuery || mapping.hasFilter())
291   - .map(mapping -> mapping.toLatestJoin(ctx, entityFilter, entityType)).collect(
292   - Collectors.joining(" "));
  298 + return latestMappings.stream()
  299 + .filter(mapping -> !countQuery || mapping.hasFilter())
  300 + .map(mapping -> mapping.toLatestJoin(ctx, entityFilter, entityType))
  301 + .collect(Collectors.joining(" "));
293 302 }
294 303
295 304 public static String buildQuery(QueryContext ctx, List<EntityKeyMapping> mappings, EntityFilterType filterType) {
... ...