Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,13 @@

@Value.Immutable
@Value.Style(deepImmutablesDetection = true)
@SuppressWarnings("PMD.ExcessivePublicCount")
public interface SqlPathSyntax {

String REGEX_GROUP_START = "(?<";
String REGEX_GROUP_VALUE_END = ">.+?)\\}";
String REGEX_NON_CAPTURING_GROUP_START = "(?:";

default List<String> asList(String path) {
return getPathSplitter().splitToList(path);
}
Expand Down Expand Up @@ -57,7 +62,7 @@ default boolean getOidFlag(String path) {
return matcher.find();
}

default String setOidFlag(String path) {
default String addOidFlag(String path) {
return String.format("%s{oid}", path);
}

Expand All @@ -67,7 +72,7 @@ default boolean getSpatialFlag(String path) {
return matcher.find();
}

default String setSpatialFlag(String path) {
default String addSpatialFlag(String path) {
return String.format("%s{spatial}", path);
}

Expand All @@ -77,7 +82,7 @@ default boolean getTemporalFlag(String path) {
return matcher.find();
}

default String setTemporalFlag(String path) {
default String addTemporalFlag(String path) {
return String.format("%s{temporal}", path);
}

Expand All @@ -91,7 +96,7 @@ default OptionalInt getPriorityFlag(String path) {
return OptionalInt.empty();
}

default String setPriorityFlag(String path, int priority) {
default String addPriorityFlag(String path, int priority) {
return String.format("%s{priority=%d}", path, priority);
}

Expand Down Expand Up @@ -125,7 +130,7 @@ default Optional<String> getSortKeyFlag(String flags) {
return Optional.empty();
}

default String setQueryableFlag(String path, String queryable) {
default String addQueryableFlag(String path, String queryable) {
return String.format("%s{queryable=%s}", path, queryable);
}

Expand All @@ -152,7 +157,7 @@ default Optional<String> getFilterFlagExpression(String flags) {
// TODO: start end separator for flags
@Value.Derived
default String getPriorityFlagPattern() {
return "\\{priority=" + "(?<" + MatcherGroups.PRIORITY + ">[0-9]+)\\}";
return "\\{priority=" + REGEX_GROUP_START + MatcherGroups.PRIORITY + ">[0-9]+)\\}";
}

@Value.Derived
Expand All @@ -172,22 +177,22 @@ default String getTemporalFlagPattern() {

@Value.Derived
default String getQueryableFlagPattern() {
return "\\{queryable=" + "(?<" + MatcherGroups.QUERYABLE + ">.+?)\\}";
return "\\{queryable=" + REGEX_GROUP_START + MatcherGroups.QUERYABLE + REGEX_GROUP_VALUE_END;
}

@Value.Derived
default String getConstantFlagPattern() {
return "\\{constant=" + "(?<" + MatcherGroups.CONSTANT + ">.+?)\\}";
return "\\{constant=" + REGEX_GROUP_START + MatcherGroups.CONSTANT + REGEX_GROUP_VALUE_END;
}

@Value.Derived
default String getSortKeyFlagPattern() {
return "\\{sortKey=" + "(?<" + MatcherGroups.SORT_KEY + ">.+?)\\}";
return "\\{sortKey=" + REGEX_GROUP_START + MatcherGroups.SORT_KEY + REGEX_GROUP_VALUE_END;
}

@Value.Derived
default String getFilterFlagPattern() {
return "\\{filter=" + "(?<" + MatcherGroups.FILTER + ">.+?)\\}";
return "\\{filter=" + REGEX_GROUP_START + MatcherGroups.FILTER + REGEX_GROUP_VALUE_END;
}

@Value.Derived
Expand Down Expand Up @@ -270,7 +275,7 @@ default String getIdentifierPattern() {
@Value.Derived
default String getColumnPattern() {
return getIdentifierPattern()
+ "(?:"
+ REGEX_NON_CAPTURING_GROUP_START
+ getMultiColumnSeparator()
+ getIdentifierPattern()
+ ")*";
Expand All @@ -294,13 +299,13 @@ default String getJoinConditionEnd() {
@Value.Derived
default String getJoinConditionPattern() {
return Pattern.quote(getJoinConditionStart())
+ "(?<"
+ REGEX_GROUP_START
+ MatcherGroups.SOURCE_FIELD
+ ">"
+ getIdentifierPattern()
+ ")"
+ Pattern.quote(getJoinConditionSeparator())
+ "(?<"
+ REGEX_GROUP_START
+ MatcherGroups.TARGET_FIELD
+ ">"
+ getIdentifierPattern()
Expand All @@ -311,27 +316,27 @@ default String getJoinConditionPattern() {
@Value.Derived
default String getJoinConditionPlainPattern() {
return Pattern.quote(getJoinConditionStart())
+ "(?:"
+ REGEX_NON_CAPTURING_GROUP_START
+ getIdentifierPattern()
+ ")"
+ Pattern.quote(getJoinConditionSeparator())
+ "(?:"
+ REGEX_NON_CAPTURING_GROUP_START
+ getIdentifierPattern()
+ ")"
+ Pattern.quote(getJoinConditionEnd());
}

@Value.Derived
default String getTablePatternString() {
return "(?:"
return REGEX_NON_CAPTURING_GROUP_START
+ getJoinConditionPattern()
+ ")?"
+ "(?<"
+ REGEX_GROUP_START
+ MatcherGroups.TABLE
+ ">"
+ getIdentifierPattern()
+ ")"
+ "(?<"
+ REGEX_GROUP_START
+ MatcherGroups.TABLE_FLAGS
+ ">"
+ getFlagsPattern()
Expand All @@ -340,13 +345,13 @@ default String getTablePatternString() {

@Value.Derived
default String getTablePatternPlainString() {
return "(?:"
return REGEX_NON_CAPTURING_GROUP_START
+ getJoinConditionPlainPattern()
+ ")?"
+ "(?:"
+ REGEX_NON_CAPTURING_GROUP_START
+ getIdentifierPattern()
+ ")"
+ "(?:"
+ REGEX_NON_CAPTURING_GROUP_START
+ getFlagsPattern()
+ ")?";
}
Expand All @@ -360,7 +365,7 @@ default Pattern getTablePattern() {
default Pattern getJoinedTablePattern() {
return Pattern.compile(
getJoinConditionPattern()
+ "(?<"
+ REGEX_GROUP_START
+ MatcherGroups.TABLE
+ ">"
+ getIdentifierPattern()
Expand All @@ -373,17 +378,17 @@ default Pattern getColumnPathPattern() {
"^(?<"
+ MatcherGroups.PATH
+ ">"
+ "(?:"
+ REGEX_NON_CAPTURING_GROUP_START
+ getPathSeparator()
+ getTablePatternString()
+ ")+)"
+ getPathSeparator()
+ "(?<"
+ REGEX_GROUP_START
+ MatcherGroups.COLUMNS
+ ">"
+ getColumnPattern()
+ ")?"
+ "(?<"
+ REGEX_GROUP_START
+ MatcherGroups.PATH_FLAGS
+ ">"
+ getFlagsPattern()
Expand All @@ -394,14 +399,14 @@ default Pattern getColumnPathPattern() {
default Pattern getPartialColumnPathPattern() {
return Pattern.compile(
getPathPatternString()
+ "(?:"
+ REGEX_NON_CAPTURING_GROUP_START
+ getPathSeparator()
+ "(?<"
+ REGEX_GROUP_START
+ MatcherGroups.COLUMNS
+ ">"
+ getColumnPattern()
+ "))"
+ "(?<"
+ REGEX_GROUP_START
+ MatcherGroups.PATH_FLAGS
+ ">"
+ getFlagsPattern()
Expand All @@ -415,13 +420,13 @@ default Pattern getPathPattern() {

@Value.Derived
default String getPathPatternString() {
return "(?<"
return REGEX_GROUP_START
+ MatcherGroups.PATH
+ ">"
+ getPathSeparator()
+ "?"
+ getTablePatternPlainString()
+ "(?:"
+ REGEX_NON_CAPTURING_GROUP_START
+ getPathSeparator()
+ getTablePatternPlainString()
+ ")*)";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
*/
package de.ii.xtraplatform.features.sql.app;

import de.ii.xtraplatform.features.sql.domain.SchemaSql;
import de.ii.xtraplatform.features.sql.domain.SqlDialect;
import de.ii.xtraplatform.features.sql.domain.SqlQueryColumn;
import de.ii.xtraplatform.features.sql.domain.SqlQueryColumn.Operation;
Expand All @@ -17,12 +16,11 @@
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class AggregateStatsQueryGenerator {

private static final Logger LOGGER = LoggerFactory.getLogger(AggregateStatsQueryGenerator.class);
private static final String FORMAT_TABLE_ALIAS = "%s %s";
private static final String FORMAT_WHERE = " WHERE %s";

private final SqlDialect sqlDialect;
private final FilterEncoderSql filterEncoder;
Expand All @@ -37,10 +35,10 @@ public String getCountQuery(SqlQueryMapping mapping) {

List<String> aliases = AliasGenerator.getAliases(sourceSchema);

String mainTable = String.format("%s %s", sourceSchema.getName(), aliases.get(0));
String mainTable = String.format(FORMAT_TABLE_ALIAS, sourceSchema.getName(), aliases.get(0));

Optional<String> filter = getFilter(mapping, sourceSchema);
String where = filter.isPresent() ? String.format(" WHERE %s", filter.get()) : "";
String where = filter.isPresent() ? String.format(FORMAT_WHERE, filter.get()) : "";

return String.format("SELECT COUNT(*) FROM %s%s", mainTable, where);
}
Expand All @@ -52,7 +50,7 @@ public String getSpatialExtentQuery(
List<String> aliases = AliasGenerator.getAliases(spatial);
String spatialAlias = aliases.get(aliases.size() - 1);

String mainTable = String.format("%s %s", mainSchema.getName(), aliases.get(0));
String mainTable = String.format(FORMAT_TABLE_ALIAS, mainSchema.getName(), aliases.get(0));

String column =
SqlQueryColumnOperations.getQualifiedColumnResolved(
Expand All @@ -66,7 +64,7 @@ public String getSpatialExtentQuery(
String join = JoinGenerator.getJoins(spatial, aliases, filterEncoder);

Optional<String> filter = getFilter(mapping, mainSchema);
String where = filter.isPresent() ? String.format(" WHERE %s", filter.get()) : "";
String where = filter.isPresent() ? String.format(FORMAT_WHERE, filter.get()) : "";

return String.format(
"SELECT %s FROM %s%s%s%s", columnExtent, mainTable, join.isEmpty() ? "" : " ", join, where);
Expand All @@ -79,7 +77,7 @@ public String getTemporalExtentQuery(
List<String> aliases = AliasGenerator.getAliases(instant);
String temporalAlias = aliases.get(aliases.size() - 1);

String mainTable = String.format("%s %s", mainSchema.getName(), aliases.get(0));
String mainTable = String.format(FORMAT_TABLE_ALIAS, mainSchema.getName(), aliases.get(0));

SqlQueryColumn instantColumnDatetime = SqlQueryColumnOperations.dateToDatetime(instantColumn);

Expand All @@ -90,7 +88,7 @@ public String getTemporalExtentQuery(
String join = JoinGenerator.getJoins(instant, aliases, filterEncoder);

Optional<String> filter = getFilter(mapping, mainSchema);
String where = filter.isPresent() ? String.format(" WHERE %s", filter.get()) : "";
String where = filter.isPresent() ? String.format(FORMAT_WHERE, filter.get()) : "";

return String.format(
"SELECT MIN(%s), MAX(%s) FROM %s%s%s%s",
Expand All @@ -109,7 +107,7 @@ public String getTemporalExtentQuery(
List<String> aliases = AliasGenerator.getAliases(intervalStart);
String temporalAlias = aliases.get(aliases.size() - 1);

String mainTable = String.format("%s %s", mainSchema.getName(), aliases.get(0));
String mainTable = String.format(FORMAT_TABLE_ALIAS, mainSchema.getName(), aliases.get(0));

SqlQueryColumn intervalStartColumnColumnDatetime =
SqlQueryColumnOperations.dateToDatetime(intervalStartColumn);
Expand All @@ -127,7 +125,7 @@ public String getTemporalExtentQuery(
String join = JoinGenerator.getJoins(intervalStart, aliases, filterEncoder);

Optional<String> filter = getFilter(mapping, mainSchema);
String where = filter.isPresent() ? String.format(" WHERE %s", filter.get()) : "";
String where = filter.isPresent() ? String.format(FORMAT_WHERE, filter.get()) : "";

return String.format(
"SELECT MIN(%s), MAX(%s) FROM %s%s%s%s",
Expand All @@ -139,7 +137,8 @@ public String getTemporalExtentQuery(
List<String> endAliases = AliasGenerator.getAliases(intervalEnd);
String endAlias = endAliases.get(endAliases.size() - 1);

String mainTable = String.format("%s %s", mainSchema.getName(), startAliases.get(0));
String mainTable =
String.format(FORMAT_TABLE_ALIAS, mainSchema.getName(), startAliases.get(0));

String columnStart =
SqlQueryColumnOperations.getQualifiedColumnResolved(
Expand All @@ -157,28 +156,15 @@ public String getTemporalExtentQuery(
String.format("%s%s%s", mainTable, endJoin.isEmpty() ? "" : " ", endJoin);

Optional<String> filter = getFilter(mapping, mainSchema);
String where = filter.isPresent() ? String.format(" WHERE %s", filter.get()) : "";
String where = filter.isPresent() ? String.format(FORMAT_WHERE, filter.get()) : "";

return String.format(
"SELECT * FROM (SELECT MIN(%s) FROM %s%s) AS A, (SELECT MAX(%s) from %s%s) AS B;",
columnStart, startTableWithJoins, where, columnEnd, endTableWithJoins, where);
}
}

private Optional<String> getFilter(SchemaSql schemaSql) {
return schemaSql.getFilter().map(cql -> filterEncoder.encode(cql, schemaSql));
}

private Optional<String> getFilter(SqlQueryMapping mapping, SqlQuerySchema schemaSql) {
return schemaSql.getFilter().map(cql -> filterEncoder.encode(cql, mapping));
}

private String getQualifiedColumn(String table, String column) {
if (column.startsWith("[EXPRESSION]{sql=")) {
return column.substring(17, column.length() - 1).replaceAll("\\$T\\$", table);
}
return column.contains("(")
? column.replaceAll("((?:\\w+\\()+)(\\w+)((?:\\))+)", "$1" + table + ".$2$3 AS $2")
: String.format("%s.%s", table, column);
}
}
Loading
Loading