diff --git a/.github/workflows/codecov.yml b/.github/workflows/codecov.yml
index 0c07a52..0ff46e3 100644
--- a/.github/workflows/codecov.yml
+++ b/.github/workflows/codecov.yml
@@ -10,11 +10,13 @@ jobs:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v1
- - name: Set up JDK 1.8
- uses: actions/setup-java@v1
+ - uses: actions/checkout@v4
+ - name: Set up JDK 11
+ uses: actions/setup-java@v4
with:
- java-version: 1.8
+ distribution: temurin
+ java-version: 11
+ cache: maven
- name: Cache Maven Repository
uses: actions/cache@v3
with:
@@ -23,7 +25,7 @@ jobs:
- name: Build with Maven
run: ./mvnw test
- name: Codecov
- uses: codecov/codecov-action@v2.1.0
+ uses: codecov/codecov-action@v4
with:
# Repository upload token - get it from codecov.io. Required only for private repositories
- token: ${{ secrets.CODECOV_TOKEN }}
\ No newline at end of file
+ token: ${{ secrets.CODECOV_TOKEN }}
diff --git a/.github/workflows/maven-publish.yml b/.github/workflows/maven-publish.yml
index 01a80dd..be5dbeb 100644
--- a/.github/workflows/maven-publish.yml
+++ b/.github/workflows/maven-publish.yml
@@ -1,7 +1,7 @@
name: Auto Deploy reactor-ql to the JetLinks Maven Repository
on:
push:
- branches: ["master"]
+ branches: ["master","1.1"]
jobs:
publish:
@@ -12,13 +12,14 @@ jobs:
# os: [ubuntu-latest, windows-latest, macOS-latest]
os: [ ubuntu-latest ]
steps:
- - uses: actions/checkout@v1
+ - uses: actions/checkout@v4
- run: echo ${{github.ref}}
- name: Set up Repository info
- uses: actions/setup-java@v2
+ uses: actions/setup-java@v4
with:
- java-version: '8'
- distribution: 'adopt'
+ java-version: '11'
+ distribution: temurin
+ cache: maven
- name: Cache Maven Repository
uses: actions/cache@v3
with:
diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml
index df9e344..f7ebc6d 100644
--- a/.github/workflows/pull_request.yml
+++ b/.github/workflows/pull_request.yml
@@ -7,11 +7,13 @@ jobs:
build:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v1
- - name: Set up JDK 1.8
- uses: actions/setup-java@v1
+ - uses: actions/checkout@v4
+ - name: Set up JDK 11
+ uses: actions/setup-java@v4
with:
- java-version: 1.8
+ distribution: temurin
+ java-version: 11
+ cache: maven
- name: Cache Maven Repository
uses: actions/cache@v3
with:
@@ -23,4 +25,4 @@ jobs:
uses: codecov/codecov-action@v2.1.0
with:
# Repository upload token - get it from codecov.io. Required only for private repositories
- token: ${{ secrets.CODECOV_TOKEN }}
\ No newline at end of file
+ token: ${{ secrets.CODECOV_TOKEN }}
diff --git a/codecov.yml b/codecov.yml
new file mode 100644
index 0000000..db9dea4
--- /dev/null
+++ b/codecov.yml
@@ -0,0 +1,7 @@
+ignore:
+ - "pom.xml"
+ - ".github/**/*"
+ - "src/main/java/org/jetlinks/reactor/ql/supports/ExpressionVisitorAdapter.java"
+
+github_checks:
+ annotations: false
diff --git a/pom.xml b/pom.xml
index 1f935ab..bf0066a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -23,7 +23,7 @@
org.jetlinks
reactor-ql
- 1.0.21-SNAPSHOT
+ 1.1.0-SNAPSHOT
JetLinks
https://github.com/jetlinks/reactor-ql
@@ -59,7 +59,7 @@
UTF-8
zh_CN
- 1.8
+ 11
${java.version}
2020.0.38
@@ -205,6 +205,7 @@
**/ExpressionVisitorAdapter*
**/ReactorQLMetadata*
+ net/sf/jsqlparser/**
@@ -253,10 +254,9 @@
org.apache.maven.plugins
maven-compiler-plugin
- 3.1
+ 3.11.0
- ${project.build.jdk}
- ${project.build.jdk}
+ ${project.build.jdk}
${project.build.sourceEncoding}
@@ -288,7 +288,7 @@
com.github.jsqlparser
jsqlparser
- 4.6
+ 5.3
@@ -397,4 +397,4 @@
https://maven.aliyun.com/nexus/content/groups/public/
-
\ No newline at end of file
+
diff --git a/src/main/java/org/jetlinks/reactor/ql/DefaultReactorQL.java b/src/main/java/org/jetlinks/reactor/ql/DefaultReactorQL.java
index 60d82b8..8ed6e8d 100644
--- a/src/main/java/org/jetlinks/reactor/ql/DefaultReactorQL.java
+++ b/src/main/java/org/jetlinks/reactor/ql/DefaultReactorQL.java
@@ -185,12 +185,12 @@ protected Function, Flux> createJoin() {
Function> rightStreamGetter = null;
//join (select deviceId,avg(temp) from temp group by interval('10s'),deviceId )
- if (from instanceof SubSelect) {
+ if (from instanceof ParenthesedSelect) {
String alias = from.getAlias() == null ? null : from.getAlias().getName();
//子查询
DefaultReactorQL ql =
new DefaultReactorQL(new DefaultReactorQLMetadata(metadata,
- ((PlainSelect) ((SubSelect) from).getSelectBody())));
+ ((PlainSelect) ((ParenthesedSelect) from).getSelect().getPlainSelect())));
rightStreamGetter = record -> ql
.builder
@@ -301,7 +301,8 @@ protected Function, Flux> createGroupBy()
groupByRef.set(nameMapper);
}
};
- for (Expression groupByExpression : groupBy.getGroupByExpressionList().getExpressions()) {
+ for (Object expression : groupBy.getGroupByExpressionList().getExpressions()) {
+ Expression groupByExpression = (Expression) expression;
//函数分组, group by interval('1s')
if (groupByExpression instanceof net.sf.jsqlparser.expression.Function) {
featureConsumer.accept(null,
@@ -404,54 +405,42 @@ private Function, Flux> createMapper() {
List> allMapper = new ArrayList<>();
- for (SelectItem selectItem : metadata.getSql().getSelectItems()) {
- selectItem.accept(new SelectItemVisitorAdapter() {
- // select a,b,c
- @Override
- public void visit(SelectExpressionItem item) {
- Expression expression = item.getExpression();
- String alias = item.getAlias() == null ? expression.toString() : item.getAlias().getName();
- String fAlias = SqlUtils.getCleanStr(alias);
- // select a,b,c
- createExpressionMapper(expression).ifPresent(mapper -> mappers.put(fAlias, mapper));
- // select count(),max(val)...
- createAggMapper(expression).ifPresent(mapper -> aggMapper.put(fAlias, mapper));
- //flatMap
- ValueFlatMapFeature.createMapperByExpression(expression, metadata)
- .ifPresent(mapper -> flatMappers.put(fAlias, mapper));
-
- if (!mappers.containsKey(fAlias) && !aggMapper.containsKey(fAlias) && !flatMappers.containsKey(fAlias)) {
- throw new UnsupportedOperationException("Unsupported expression:" + expression);
- }
- }
-
- //select *
- @Override
- public void visit(AllColumns columns) {
- allMapper.add(ReactorQLRecord::putRecordToResult);
- }
-
- //select t.*
- @Override
- public void visit(AllTableColumns columns) {
- String name;
- Alias alias = columns.getTable().getAlias();
- if (alias == null) {
- name = SqlUtils.getCleanStr(columns.getTable().getName());
- } else {
- name = SqlUtils.getCleanStr(alias.getName());
- }
- allMapper.add(record -> record
- .getRecord(name)
- .ifPresent(v -> {
- if (v instanceof Map) {
- record.setResults(((Map) v));
- } else {
- record.setResult(name, v);
- }
- }));
+ for (SelectItem> selectItem : metadata.getSql().getSelectItems()) {
+ Expression expression = selectItem.getExpression();
+ if (expression instanceof AllColumns) {
+ allMapper.add(ReactorQLRecord::putRecordToResult);
+ continue;
+ }
+ if (expression instanceof AllTableColumns) {
+ AllTableColumns columns = (AllTableColumns) expression;
+ String name;
+ Alias alias = columns.getTable().getAlias();
+ if (alias == null) {
+ name = SqlUtils.getCleanStr(columns.getTable().getName());
+ } else {
+ name = SqlUtils.getCleanStr(alias.getName());
}
- });
+ allMapper.add(record -> record
+ .getRecord(name)
+ .ifPresent(v -> {
+ if (v instanceof Map) {
+ record.setResults(((Map) v));
+ } else {
+ record.setResult(name, v);
+ }
+ }));
+ continue;
+ }
+ String alias = selectItem.getAlias() == null ? expression.toString() : selectItem.getAlias().getName();
+ String fAlias = SqlUtils.getCleanStr(alias);
+ createExpressionMapper(expression).ifPresent(mapper -> mappers.put(fAlias, mapper));
+ createAggMapper(expression).ifPresent(mapper -> aggMapper.put(fAlias, mapper));
+ ValueFlatMapFeature.createMapperByExpression(expression, metadata)
+ .ifPresent(mapper -> flatMappers.put(fAlias, mapper));
+
+ if (!mappers.containsKey(fAlias) && !aggMapper.containsKey(fAlias) && !flatMappers.containsKey(fAlias)) {
+ throw new UnsupportedOperationException("Unsupported expression:" + expression);
+ }
}
Function> _resultMapper;
diff --git a/src/main/java/org/jetlinks/reactor/ql/feature/FromFeature.java b/src/main/java/org/jetlinks/reactor/ql/feature/FromFeature.java
index 41cb722..5ece3ad 100644
--- a/src/main/java/org/jetlinks/reactor/ql/feature/FromFeature.java
+++ b/src/main/java/org/jetlinks/reactor/ql/feature/FromFeature.java
@@ -40,56 +40,46 @@ static Function> createFromMapperByFrom(
if (body == null) {
return ctx -> ctx.getDataSource(null).map(val -> ReactorQLRecord.newRecord(null, val, ctx));
}
- AtomicReference>> ref = new AtomicReference<>();
-
- body.accept(new FromItemVisitorAdapter() {
- // from table
- @Override
- public void visit(Table table) {
- ref.set(metadata.getFeatureNow(FeatureId.From.table)
- .createFromMapper(table, metadata));
- }
-
- // from (select ...)
- @Override
- public void visit(SubSelect subSelect) {
- ref.set(metadata.getFeatureNow(FeatureId.From.subSelect)
- .createFromMapper(subSelect, metadata));
- }
-
- // select * from (values(6)) t(v)
- @Override
- public void visit(ValuesList valuesList) {
- ref.set(metadata.getFeatureNow(FeatureId.From.values)
- .createFromMapper(valuesList, metadata));
- }
-
- //select * from mysql(...)
- @Override
- public void visit(TableFunction tableFunction) {
- ref.set(metadata
- .getFeatureNow(FeatureId.From.of(tableFunction.getFunction().getName()),
- tableFunction::toString)
- .createFromMapper(tableFunction, metadata));
- }
-
- @Override
- public void visit(ParenthesisFromItem aThis) {
- ref.set(createFromMapperByFrom(aThis.getFromItem(), metadata));
+ if (body instanceof Table) {
+ return metadata.getFeatureNow(FeatureId.From.table)
+ .createFromMapper(body, metadata);
+ }
+ if (body instanceof ParenthesedSelect || body instanceof Select) {
+ return metadata.getFeatureNow(FeatureId.From.subSelect)
+ .createFromMapper(body, metadata);
+ }
+ if (body instanceof Values) {
+ return metadata.getFeatureNow(FeatureId.From.values)
+ .createFromMapper(body, metadata);
+ }
+ if (body instanceof ParenthesedFromItem) {
+ ParenthesedFromItem fromItem = (ParenthesedFromItem) body;
+ if (fromItem.getFromItem() instanceof Values) {
+ return metadata.getFeatureNow(FeatureId.From.values)
+ .createFromMapper(body, metadata);
}
- });
- if (ref.get() == null) {
- throw new UnsupportedOperationException("不支持的查询:" + body);
+ return createFromMapperByFrom(fromItem.getFromItem(), metadata);
+ }
+ if (body instanceof TableFunction) {
+ TableFunction tableFunction = (TableFunction) body;
+ return metadata
+ .getFeatureNow(FeatureId.From.of(tableFunction.getFunction().getName()),
+ tableFunction::toString)
+ .createFromMapper(tableFunction, metadata);
}
- return ref.get();
+ throw new UnsupportedOperationException("不支持的查询:" + body);
}
- static Function> createFromMapperByBody(SelectBody body, ReactorQLMetadata metadata) {
+ static Function> createFromMapperByBody(Select body, ReactorQLMetadata metadata) {
FromItem from = null;
if (body instanceof PlainSelect) {
PlainSelect select = ((PlainSelect) body);
from = select.getFromItem();
+ } else if (body instanceof ParenthesedSelect) {
+ return createFromMapperByBody(((ParenthesedSelect) body).getSelect(), metadata);
+ } else if (body instanceof Values) {
+ from = body;
}
return createFromMapperByFrom(from, metadata);
}
diff --git a/src/main/java/org/jetlinks/reactor/ql/feature/ValueMapFeature.java b/src/main/java/org/jetlinks/reactor/ql/feature/ValueMapFeature.java
index b7414d1..fe5e3fb 100644
--- a/src/main/java/org/jetlinks/reactor/ql/feature/ValueMapFeature.java
+++ b/src/main/java/org/jetlinks/reactor/ql/feature/ValueMapFeature.java
@@ -17,8 +17,9 @@
import net.sf.jsqlparser.expression.*;
import net.sf.jsqlparser.expression.operators.relational.ExistsExpression;
+import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
import net.sf.jsqlparser.schema.Column;
-import net.sf.jsqlparser.statement.select.SubSelect;
+import net.sf.jsqlparser.statement.select.Select;
import org.apache.commons.collections.CollectionUtils;
import org.jetlinks.reactor.ql.ReactorQLMetadata;
import org.jetlinks.reactor.ql.ReactorQLRecord;
@@ -77,7 +78,7 @@ public void visit(net.sf.jsqlparser.expression.Function function) {
//select (select * from xxx) data1 from ...
@Override
- public void visit(SubSelect subSelect) {
+ public void visit(Select subSelect) {
ref.set(metadata
.getFeatureNow(FeatureId.ValueMap.select, expr::toString)
.createMapper(subSelect, metadata));
@@ -190,6 +191,12 @@ public void visit(DoubleValue value) {
ref.set((v) -> val);
}
+ @Override
+ public void visit(BooleanValue value) {
+ Mono