Skip to content

Commit e1ff230

Browse files
committed
Fix #20052: Combine user filter with existing metric filter in Data Insights charts
1 parent 3f02885 commit e1ff230

1 file changed

Lines changed: 44 additions & 2 deletions

File tree

openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DataInsightSystemChartRepository.java

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
import static org.openmetadata.service.Entity.INGESTION_PIPELINE;
55

66
import com.google.gson.Gson;
7+
import com.google.gson.JsonArray;
8+
import com.google.gson.JsonObject;
9+
import com.google.gson.JsonParser;
710
import java.io.IOException;
811
import java.util.ArrayList;
912
import java.util.HashMap;
@@ -675,6 +678,43 @@ public void storeRelationships(DataInsightCustomChart entity) {
675678
// No relationships to store beyond what is stored in the super class
676679
}
677680

681+
static String combineFilters(String existingFilter, String userFilter) {
682+
if (existingFilter == null || existingFilter.isEmpty() || existingFilter.equals("{}")) {
683+
return userFilter;
684+
}
685+
if (userFilter == null || userFilter.isEmpty() || userFilter.equals("{}")) {
686+
return existingFilter;
687+
}
688+
try {
689+
JsonObject existingJson = JsonParser.parseString(existingFilter).getAsJsonObject();
690+
JsonObject userJson = JsonParser.parseString(userFilter).getAsJsonObject();
691+
692+
JsonObject existingQuery = existingJson.getAsJsonObject("query");
693+
JsonObject userQuery = userJson.getAsJsonObject("query");
694+
695+
if (existingQuery == null) return userFilter;
696+
if (userQuery == null) return existingFilter;
697+
698+
JsonArray mustArray = new JsonArray();
699+
mustArray.add(existingQuery);
700+
mustArray.add(userQuery);
701+
702+
JsonObject boolObj = new JsonObject();
703+
boolObj.add("must", mustArray);
704+
705+
JsonObject combinedQuery = new JsonObject();
706+
combinedQuery.add("bool", boolObj);
707+
708+
JsonObject result = new JsonObject();
709+
result.add("query", combinedQuery);
710+
711+
return result.toString();
712+
} catch (Exception e) {
713+
LOG.warn("Failed to combine filters, using user filter as fallback: {}", e.getMessage());
714+
return userFilter;
715+
}
716+
}
717+
678718
public DataInsightCustomChartResultList getPreviewData(
679719
DataInsightCustomChart chart, long startTimestamp, long endTimestamp, String filter)
680720
throws IOException {
@@ -683,7 +723,8 @@ public DataInsightCustomChartResultList getPreviewData(
683723
if (chartDetails.get("metrics") != null) {
684724
for (LinkedHashMap<String, Object> metrics :
685725
(List<LinkedHashMap<String, Object>>) chartDetails.get("metrics")) {
686-
metrics.put("filter", filter);
726+
String existingFilter = (String) metrics.get("filter");
727+
metrics.put("filter", combineFilters(existingFilter, filter));
687728
}
688729
}
689730
}
@@ -718,7 +759,8 @@ public Map<String, DataInsightCustomChartResultList> listChartData(
718759
if (chartDetails.get("metrics") != null) {
719760
for (LinkedHashMap<String, Object> metrics :
720761
(List<LinkedHashMap<String, Object>>) chartDetails.get("metrics")) {
721-
metrics.put("filter", filter);
762+
String existingFilter = (String) metrics.get("filter");
763+
metrics.put("filter", combineFilters(existingFilter, filter));
722764
}
723765
}
724766
}

0 commit comments

Comments
 (0)