Skip to content

Commit fe9d8fd

Browse files
authored
Merge pull request #1606 from utmstack/backlog/extend-visualization-creation-flow-to-include-SQL
Backlog/extend visualization creation flow to include sql
2 parents bc56320 + 545cac3 commit fe9d8fd

File tree

49 files changed

+1000
-224
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+1000
-224
lines changed

backend/src/main/java/com/park/utmstack/domain/chart_builder/UtmVisualization.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,6 @@ public class UtmVisualization implements Serializable {
6969
@Column(name = "system_owner")
7070
private Boolean systemOwner;
7171

72-
@NotNull
7372
@Column(name = "id_pattern")
7473
private Long idPattern;
7574

@@ -104,7 +103,10 @@ public class UtmVisualization implements Serializable {
104103
@JsonDeserialize
105104
private AggregationType aggregationType;
106105

107-
@ManyToOne(fetch = FetchType.EAGER)
106+
@Column(name = "sql_query", nullable = true)
107+
private String sqlQuery;
108+
109+
@ManyToOne(fetch = FetchType.EAGER, optional = true)
108110
@JoinColumn(name = "id_pattern", referencedColumnName = "id", insertable = false, updatable = false)
109111
private UtmIndexPattern pattern;
110112

@@ -196,6 +198,10 @@ public void setQuery(String query) {
196198
}
197199

198200
public List<FilterType> getFilterType() throws UtmSerializationException {
201+
if (_filters == null) {
202+
return null;
203+
}
204+
199205
filterType = UtilSerializer.jsonDeserializeList(FilterType.class, _filters);
200206
return filterType;
201207
}
@@ -225,6 +231,14 @@ public void setAggregationType(AggregationType aggregationType) throws UtmSerial
225231
this.aggregationType = aggregationType;
226232
}
227233

234+
public String getSqlQuery() {
235+
return sqlQuery;
236+
}
237+
238+
public void setSqlQuery(String sqlQuery) {
239+
this.sqlQuery = sqlQuery;
240+
}
241+
228242
public String getChartAction() {
229243
return chartAction;
230244
}

backend/src/main/java/com/park/utmstack/service/dto/elastic/SqlSearchDto.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55
import lombok.Data;
66
import lombok.NoArgsConstructor;
77

8-
import javax.validation.constraints.NotNull;
9-
108
@Data
119
@AllArgsConstructor
1210
@NoArgsConstructor
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.park.utmstack.service.dto.visualization;
2+
3+
import com.park.utmstack.domain.chart_builder.types.ChartType;
4+
import com.park.utmstack.domain.chart_builder.types.aggregation.AggregationType;
5+
import com.park.utmstack.domain.chart_builder.types.query.FilterType;
6+
import com.park.utmstack.domain.index_pattern.UtmIndexPattern;
7+
import com.park.utmstack.service.dto.visualization.enums.QueryLanguageEnum;
8+
import com.park.utmstack.validation.elasticsearch.SqlSelectOnly;
9+
import lombok.AllArgsConstructor;
10+
import lombok.Data;
11+
import lombok.NoArgsConstructor;
12+
13+
import java.time.Instant;
14+
import java.util.List;
15+
16+
@Data
17+
@NoArgsConstructor
18+
@AllArgsConstructor
19+
public class UtmVisualizationDto {
20+
private Long id;
21+
private String name;
22+
private String description;
23+
private String eventType;
24+
private Instant createdDate;
25+
private Instant modifiedDate;
26+
private String userCreated;
27+
private String userModified;
28+
private String chartConfig;
29+
private String chartAction;
30+
private Boolean systemOwner;
31+
private Long idPattern;
32+
private UtmIndexPattern pattern;
33+
private ChartType chartType;
34+
private String query;
35+
@SqlSelectOnly
36+
private String sqlQuery;
37+
private List<FilterType> filterType;
38+
private AggregationType aggregationType;
39+
private QueryLanguageEnum queryLanguage;
40+
}
41+
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.park.utmstack.service.dto.visualization.enums;
2+
3+
public enum QueryLanguageEnum {
4+
DSL,
5+
SQL
6+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.park.utmstack.service.dto.visualization.mapper;
2+
3+
import com.park.utmstack.domain.chart_builder.UtmVisualization;
4+
import com.park.utmstack.service.dto.visualization.UtmVisualizationDto;
5+
import com.park.utmstack.util.exceptions.UtmSerializationException;
6+
import org.mapstruct.Mapper;
7+
import org.mapstruct.factory.Mappers;
8+
9+
@Mapper(componentModel = "spring")
10+
public interface UtmVisualizationMapper {
11+
UtmVisualizationMapper INSTANCE = Mappers.getMapper(UtmVisualizationMapper.class);
12+
13+
UtmVisualizationDto toDto(UtmVisualization entity) throws UtmSerializationException;
14+
15+
UtmVisualization toEntity(UtmVisualizationDto dto) throws UtmSerializationException;
16+
}

backend/src/main/java/com/park/utmstack/util/chart_builder/elasticsearch_dsl/responses/ResponseParser.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,16 @@
22

33
import com.fasterxml.jackson.databind.node.ObjectNode;
44
import com.park.utmstack.domain.chart_builder.UtmVisualization;
5+
import com.utmstack.opensearch_connector.types.SearchSqlResponse;
56
import org.opensearch.client.opensearch.core.SearchResponse;
67

78
import java.util.List;
9+
import java.util.Map;
810

911
public interface ResponseParser<T> {
1012
List<T> parse(UtmVisualization visualization, SearchResponse<ObjectNode> result);
13+
14+
default List<T> parse(UtmVisualization visualization, SearchSqlResponse<Map> result) {
15+
return null;
16+
}
1117
}

backend/src/main/java/com/park/utmstack/util/chart_builder/elasticsearch_dsl/responses/impl/bar_chart/ResponseParserForBarChart.java

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.utmstack.opensearch_connector.parsers.DateHistogramAggregateParser;
1111
import com.utmstack.opensearch_connector.parsers.TermAggregateParser;
1212
import com.utmstack.opensearch_connector.types.BucketAggregation;
13+
import com.utmstack.opensearch_connector.types.SearchSqlResponse;
1314
import org.opensearch.client.opensearch._types.aggregations.*;
1415
import org.opensearch.client.opensearch.core.SearchResponse;
1516
import org.springframework.util.CollectionUtils;
@@ -201,4 +202,49 @@ private void parseMetric(SearchResponse<?> result, List<Metric> metrics) {
201202
throw new RuntimeException(ctx + ": " + e.getLocalizedMessage());
202203
}
203204
}
205+
206+
@Override
207+
public List<BarChartResult> parse(UtmVisualization visualization, SearchSqlResponse<Map> result) {
208+
final String ctx = CLASSNAME + ".parse(SearchSqlResponse)";
209+
try {
210+
BarChartResult retValue = new BarChartResult();
211+
212+
BarChartResult.Serie serie = new BarChartResult.Serie();
213+
serie.setMetricId("1");
214+
215+
for (Object rowObj : result.getData()) {
216+
if (!(rowObj instanceof Map)) {
217+
continue;
218+
}
219+
Map<String, Object> row = (Map<String, Object>) rowObj;
220+
221+
String category = null;
222+
Double value = 0.0;
223+
224+
for (Map.Entry<String, Object> entry : row.entrySet()) {
225+
Object val = entry.getValue();
226+
if (val instanceof Number) {
227+
value = ((Number) val).doubleValue();
228+
if (serie.getName() == null) {
229+
serie.setName(entry.getKey() != null ? entry.getKey() : "metric");
230+
}
231+
} else {
232+
category = val != null ? val.toString() : "UNKNOWN";
233+
}
234+
}
235+
236+
if (category != null) {
237+
retValue.addCategory(category);
238+
serie.addData(value);
239+
}
240+
}
241+
242+
retValue.addSerie(serie);
243+
244+
return Collections.singletonList(retValue);
245+
} catch (Exception e) {
246+
throw new RuntimeException(ctx + ": " + e.getMessage());
247+
}
248+
}
249+
204250
}

backend/src/main/java/com/park/utmstack/util/chart_builder/elasticsearch_dsl/responses/impl/coordinate_map/ResponseParserForCoordinateMapChart.java

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,17 @@
1111
import com.park.utmstack.util.exceptions.UtmIpInfoException;
1212
import com.utmstack.opensearch_connector.parsers.TermAggregateParser;
1313
import com.utmstack.opensearch_connector.types.BucketAggregation;
14+
import com.utmstack.opensearch_connector.types.SearchSqlResponse;
1415
import org.opensearch.client.opensearch.core.SearchResponse;
1516
import org.slf4j.Logger;
1617
import org.slf4j.LoggerFactory;
1718
import org.springframework.stereotype.Component;
19+
import org.springframework.util.Assert;
1820
import org.springframework.util.StringUtils;
1921

2022
import java.util.ArrayList;
2123
import java.util.List;
24+
import java.util.Map;
2225
import java.util.stream.Collectors;
2326

2427
@Component
@@ -110,5 +113,58 @@ public static boolean isValidIPv6(String ip) {
110113
return ip.matches(regex);
111114
}
112115

116+
@Override
117+
public List<CoordinateMapChartResult> parse(UtmVisualization visualization, SearchSqlResponse<Map> result) {
118+
final String ctx = CLASSNAME + ".parse(SearchSqlResponse)";
119+
List<CoordinateMapChartResult> retValue = new ArrayList<>();
120+
121+
try {
122+
Assert.notNull(visualization, "Param visualization must not be null");
123+
124+
for (Object rowObj : result.getData()) {
125+
if (!(rowObj instanceof Map)) continue;
126+
Map<String, Object> row = (Map<String, Object>) rowObj;
127+
128+
String ip = null;
129+
Double metricValue = null;
130+
131+
for (Map.Entry<String, Object> entry : row.entrySet()) {
132+
Object val = entry.getValue();
133+
if (val == null) continue;
134+
135+
String strVal = val.toString();
136+
if (ip == null && isValidIP(strVal)) {
137+
ip = strVal;
138+
} else if (metricValue == null && val instanceof Number) {
139+
metricValue = ((Number) val).doubleValue();
140+
}
141+
}
113142

143+
if (ip == null || metricValue == null) continue;
144+
145+
GeoIp ipInfo;
146+
try {
147+
ipInfo = ipInfoService.getIpInfo(ip);
148+
if (ipInfo == null) continue;
149+
} catch (UtmIpInfoException e) {
150+
log.error(e.getMessage());
151+
continue;
152+
}
153+
154+
CoordinateMapChartResult chartResult = new CoordinateMapChartResult();
155+
chartResult.setName(ip);
156+
chartResult.setValue(new Double[] {
157+
ipInfo.getLatitude(),
158+
ipInfo.getLongitude(),
159+
metricValue
160+
});
161+
162+
retValue.add(chartResult);
163+
}
164+
165+
return retValue;
166+
} catch (Exception e) {
167+
throw new RuntimeException(ctx + ": " + e.getMessage(), e);
168+
}
169+
}
114170
}

backend/src/main/java/com/park/utmstack/util/chart_builder/elasticsearch_dsl/responses/impl/gauge_goal_chart/ResponseParserForGaugeGoalChart.java

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import com.park.utmstack.util.chart_builder.elasticsearch_dsl.responses.ResponseParser;
1010
import com.utmstack.opensearch_connector.parsers.TermAggregateParser;
1111
import com.utmstack.opensearch_connector.types.BucketAggregation;
12+
import com.utmstack.opensearch_connector.types.SearchSqlResponse;
1213
import org.opensearch.client.opensearch._types.aggregations.*;
1314
import org.opensearch.client.opensearch.core.SearchResponse;
1415
import org.springframework.util.Assert;
@@ -111,4 +112,51 @@ private List<GaugeGoalChartResult> parseTermAggregation(Map<String, Aggregate> r
111112
}
112113
return rturn;
113114
}
115+
116+
@Override
117+
public List<GaugeGoalChartResult> parse(UtmVisualization visualization, SearchSqlResponse<Map> result) {
118+
final String ctx = CLASSNAME + ".parse(SearchSqlResponse)";
119+
try {
120+
Assert.notNull(visualization, "Param visualization must not be null");
121+
122+
List<GaugeGoalChartResult> results = new ArrayList<>();
123+
124+
for (Object rowObj : result.getData()) {
125+
if (!(rowObj instanceof Map)) continue;
126+
Map<String, Object> row = (Map<String, Object>) rowObj;
127+
128+
String bucketKey = null;
129+
String bucketId = null;
130+
131+
Double metricValue = null;
132+
String metricId = null;
133+
134+
for (Map.Entry<String, Object> entry : row.entrySet()) {
135+
String key = entry.getKey();
136+
Object val = entry.getValue();
137+
138+
if (val == null) continue;
139+
140+
if (val instanceof Number) {
141+
metricValue = ((Number) val).doubleValue();
142+
metricId = key;
143+
} else {
144+
bucketKey = val.toString();
145+
bucketId = key;
146+
}
147+
}
148+
149+
if (metricValue == null) metricValue = 0.0;
150+
if (metricId == null) metricId = "metric";
151+
if (bucketKey == null) bucketKey = "UNKNOWN";
152+
if (bucketId == null) bucketId = "bucket";
153+
154+
results.add(new GaugeGoalChartResult(metricId, metricValue, bucketKey, bucketId));
155+
}
156+
157+
return results;
158+
} catch (Exception e) {
159+
throw new RuntimeException(ctx + ": " + e.getMessage(), e);
160+
}
161+
}
114162
}

0 commit comments

Comments
 (0)