Skip to content

Commit b7dffda

Browse files
authored
feat(查询条件): 添加设备查询条件构造器 (#260)
1 parent 7e5b898 commit b7dffda

File tree

5 files changed

+320
-0
lines changed

5 files changed

+320
-0
lines changed
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package org.jetlinks.community.device.service.term;
2+
3+
import org.hswebframework.ezorm.core.param.Term;
4+
import org.hswebframework.ezorm.rdb.metadata.RDBColumnMetadata;
5+
import org.hswebframework.ezorm.rdb.operator.builder.fragments.PrepareSqlFragments;
6+
import org.hswebframework.ezorm.rdb.operator.builder.fragments.SqlFragments;
7+
import org.hswebframework.ezorm.rdb.operator.builder.fragments.term.AbstractTermFragmentBuilder;
8+
import org.springframework.stereotype.Component;
9+
10+
import java.util.List;
11+
import java.util.stream.Collectors;
12+
13+
/**
14+
* 根据产品分类查询与产品关联的数据,如: 查询某个分类下的产品列表.
15+
* <p>
16+
* <b>
17+
* 注意: 查询时指定列名是和产品ID关联的列或者实体类属性名.
18+
* 如: 查询设备列表时则使用productId.
19+
* 此条件仅支持关系型数据库中的查询.
20+
* </b>
21+
* <p>
22+
* 在通用查询接口中可以使用动态查询参数中的<code>term.termType</code>来使用此功能.
23+
* <a href="https://doc.jetlinks.cn/interface-guide/query-param.html">查看动态查询参数说明</a>
24+
* <p>
25+
* 在内部通用条件中,可以使用DSL方式创建条件,例如:
26+
* <pre>
27+
* createQuery()
28+
* .where()
29+
* .and("productId","dev-prod-cat",cateId)
30+
* .fetch()
31+
* </pre>
32+
*
33+
* @author zhouhao
34+
* @since 1.3
35+
*/
36+
@Component
37+
public class DeviceCategoryTerm extends AbstractTermFragmentBuilder {
38+
39+
public DeviceCategoryTerm() {
40+
super("dev-prod-cat", "按产品品类查询");
41+
}
42+
43+
@Override
44+
public SqlFragments createFragments(String columnFullName, RDBColumnMetadata column, Term term) {
45+
46+
PrepareSqlFragments sqlFragments = PrepareSqlFragments.of();
47+
48+
List<Object> idList = convertList(column, term);
49+
50+
sqlFragments.addSql("exists(select 1 from dev_product prod where prod.id =", columnFullName);
51+
52+
sqlFragments.addSql("and exists(select 1 from dev_product_category g where g.id = prod.classified_id and ");
53+
sqlFragments.addSql(
54+
idList
55+
.stream()
56+
.map(r -> "path like (select concat(path,'%') from dev_product_category g2 where g2.id = ?)")
57+
.collect(Collectors.joining(" or ", "(", ")"))
58+
, ")")
59+
.addParameter(idList);
60+
61+
sqlFragments.addSql(")");
62+
63+
return sqlFragments;
64+
}
65+
}
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
package org.jetlinks.community.device.service.term;
2+
3+
import org.hswebframework.ezorm.core.param.Term;
4+
import org.hswebframework.ezorm.rdb.metadata.RDBColumnMetadata;
5+
import org.hswebframework.ezorm.rdb.metadata.RDBTableMetadata;
6+
import org.hswebframework.ezorm.rdb.metadata.TableOrViewMetadata;
7+
import org.hswebframework.ezorm.rdb.operator.builder.fragments.*;
8+
import org.hswebframework.ezorm.rdb.operator.builder.fragments.term.AbstractTermFragmentBuilder;
9+
import org.jetlinks.community.utils.ConverterUtils;
10+
import org.springframework.stereotype.Component;
11+
12+
import java.util.List;
13+
14+
15+
/**
16+
* 根据设备查询.
17+
* <p>
18+
* 将设备信息的条件嵌套到此条件中
19+
* <p>
20+
* <pre>
21+
* "terms": [
22+
* {
23+
* "column": "device_id$dev-instance",
24+
* "value": [
25+
* {
26+
* "column": "product_id",
27+
* "termType": "eq",
28+
* "value": "1"
29+
* }
30+
* ]
31+
* }
32+
* ],
33+
* </pre>
34+
*
35+
* @author zhouhao
36+
* @since 1.6
37+
*/
38+
@Component
39+
public class DeviceInstanceTerm extends AbstractTermFragmentBuilder {
40+
41+
public static final String termType = "dev-instance";
42+
43+
public DeviceInstanceTerm() {
44+
super(termType, "根据设备信息查询");
45+
}
46+
47+
@Override
48+
public SqlFragments createFragments(String columnFullName,
49+
RDBColumnMetadata column,
50+
Term term) {
51+
List<Term> terms = ConverterUtils.convertTerms(term.getValue());
52+
PrepareSqlFragments sqlFragments = PrepareSqlFragments.of();
53+
if (term.getOptions().contains("not")) {
54+
sqlFragments.addSql("not");
55+
}
56+
sqlFragments.addSql("exists(select 1 from ", getTableName("dev_device_instance", column), " _dev where _dev.id = ", columnFullName);
57+
58+
RDBTableMetadata metadata = column
59+
.getOwner()
60+
.getSchema()
61+
.getTable("dev_device_instance")
62+
.orElseThrow(() -> new UnsupportedOperationException("unsupported dev_device_instance"));
63+
64+
SqlFragments where = builder.createTermFragments(metadata, terms);
65+
if (!where.isEmpty()) {
66+
sqlFragments.addSql("and")
67+
.addFragments(where);
68+
}
69+
sqlFragments.addSql(")");
70+
return sqlFragments;
71+
}
72+
73+
74+
static DeviceTermsBuilder builder = new DeviceTermsBuilder();
75+
76+
static class DeviceTermsBuilder extends AbstractTermsFragmentBuilder<TableOrViewMetadata> {
77+
78+
@Override
79+
protected SqlFragments createTermFragments(TableOrViewMetadata parameter,
80+
List<Term> terms) {
81+
return super.createTermFragments(parameter, terms);
82+
}
83+
84+
@Override
85+
protected SqlFragments createTermFragments(TableOrViewMetadata table,
86+
Term term) {
87+
if (term.getValue() instanceof NativeSql) {
88+
NativeSql sql = ((NativeSql) term.getValue());
89+
return PrepareSqlFragments.of(sql.getSql(), sql.getParameters());
90+
}
91+
return table
92+
.getColumn(term.getColumn())
93+
.flatMap(column -> table
94+
.findFeature(TermFragmentBuilder.createFeatureId(term.getTermType()))
95+
.map(termFragment -> termFragment.createFragments(column.getFullName("_dev"), column, term)))
96+
.orElse(EmptySqlFragments.INSTANCE);
97+
}
98+
}
99+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package org.jetlinks.community.device.service.term;
2+
3+
import org.hswebframework.ezorm.core.param.Term;
4+
import org.hswebframework.ezorm.rdb.metadata.RDBColumnMetadata;
5+
import org.hswebframework.ezorm.rdb.metadata.RDBTableMetadata;
6+
import org.hswebframework.ezorm.rdb.metadata.TableOrViewMetadata;
7+
import org.hswebframework.ezorm.rdb.operator.builder.fragments.*;
8+
import org.hswebframework.ezorm.rdb.operator.builder.fragments.term.AbstractTermFragmentBuilder;
9+
import org.jetlinks.community.utils.ConverterUtils;
10+
import org.springframework.stereotype.Component;
11+
12+
import java.util.List;
13+
14+
/**
15+
* 根据设备产品信息查询设备数据
16+
*
17+
* @author bestfeng
18+
* @since 2.0
19+
*/
20+
@Component
21+
public class DeviceProductInfoTermBuilder extends AbstractTermFragmentBuilder {
22+
23+
public static final String termType = "product-info";
24+
25+
public DeviceProductInfoTermBuilder() {
26+
super(termType, "根据产品信息查询设备数据");
27+
}
28+
29+
30+
@SuppressWarnings("all")
31+
public static List<Term> convertTerms(Object value) {
32+
return ConverterUtils.convertTerms(value);
33+
}
34+
35+
36+
@Override
37+
public SqlFragments createFragments(String columnFullName, RDBColumnMetadata column, Term term) {
38+
List<Term> terms = convertTerms(term.getValue());
39+
PrepareSqlFragments sqlFragments = PrepareSqlFragments.of();
40+
if(term.getOptions().contains("not")){
41+
sqlFragments.addSql("not");
42+
}
43+
sqlFragments
44+
.addSql("exists(select 1 from ",getTableName("dev_product",column)," _product where _product.id = ", columnFullName);
45+
46+
RDBTableMetadata metadata = column
47+
.getOwner()
48+
.getSchema()
49+
.getTable("dev_product")
50+
.orElseThrow(() -> new UnsupportedOperationException("unsupported dev_product"));
51+
52+
SqlFragments where = builder.createTermFragments(metadata, terms);
53+
if (!where.isEmpty()) {
54+
sqlFragments.addSql("and")
55+
.addFragments(where);
56+
}
57+
sqlFragments.addSql(")");
58+
return sqlFragments;
59+
}
60+
61+
62+
static ProductTermBuilder builder = new ProductTermBuilder();
63+
64+
static class ProductTermBuilder extends AbstractTermsFragmentBuilder<TableOrViewMetadata> {
65+
66+
@Override
67+
protected SqlFragments createTermFragments(TableOrViewMetadata parameter, List<Term> terms) {
68+
return super.createTermFragments(parameter, terms);
69+
}
70+
71+
@Override
72+
protected SqlFragments createTermFragments(TableOrViewMetadata table, Term term) {
73+
if (term.getValue() instanceof NativeSql) {
74+
NativeSql sql = ((NativeSql) term.getValue());
75+
return PrepareSqlFragments.of(sql.getSql(), sql.getParameters());
76+
}
77+
return table
78+
.getColumn(term.getColumn())
79+
.flatMap(column -> table
80+
.findFeature(TermFragmentBuilder.createFeatureId(term.getTermType()))
81+
.map(termFragment -> termFragment.createFragments(column.getFullName("_product"), column, term)))
82+
.orElse(EmptySqlFragments.INSTANCE);
83+
}
84+
}
85+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package org.jetlinks.community.device.service.term;
2+
3+
import org.hswebframework.ezorm.core.param.Term;
4+
import org.hswebframework.ezorm.rdb.metadata.RDBColumnMetadata;
5+
import org.hswebframework.ezorm.rdb.operator.builder.fragments.PrepareSqlFragments;
6+
import org.hswebframework.ezorm.rdb.operator.builder.fragments.SqlFragments;
7+
import org.hswebframework.ezorm.rdb.operator.builder.fragments.term.AbstractTermFragmentBuilder;
8+
import org.springframework.stereotype.Component;
9+
10+
import java.util.List;
11+
12+
13+
@Component
14+
public class DeviceProtocolTerm extends AbstractTermFragmentBuilder {
15+
public DeviceProtocolTerm() {
16+
super("dev-protocol", "按协议查询设备");
17+
}
18+
19+
@Override
20+
public SqlFragments createFragments(String columnFullName, RDBColumnMetadata column, Term term) {
21+
PrepareSqlFragments sqlFragments = PrepareSqlFragments.of();
22+
List<Object> idList = convertList(column, term);
23+
if (term.getOptions().contains("not")) {
24+
sqlFragments.addSql("not");
25+
}
26+
sqlFragments
27+
.addSql("exists(select 1 from ",getTableName("dev_product",column)," _product where _product.id = " + columnFullName);
28+
sqlFragments
29+
.addSql(" and _product.message_protocol = ?");
30+
sqlFragments.addSql(")").addParameter(idList);
31+
32+
return sqlFragments;
33+
}
34+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package org.jetlinks.community.device.service.term;
2+
3+
import org.hswebframework.ezorm.core.param.Term;
4+
import org.hswebframework.ezorm.rdb.metadata.RDBColumnMetadata;
5+
import org.hswebframework.ezorm.rdb.operator.builder.fragments.PrepareSqlFragments;
6+
import org.hswebframework.ezorm.rdb.operator.builder.fragments.SqlFragments;
7+
import org.hswebframework.ezorm.rdb.operator.builder.fragments.term.AbstractTermFragmentBuilder;
8+
import org.springframework.stereotype.Component;
9+
10+
import java.util.List;
11+
import java.util.stream.Collectors;
12+
13+
14+
@Component
15+
public class DeviceTypeTerm extends AbstractTermFragmentBuilder {
16+
public DeviceTypeTerm() {
17+
super("dev-device-type", "按设备类型查询设备");
18+
}
19+
20+
@Override
21+
public SqlFragments createFragments(String columnFullName, RDBColumnMetadata column, Term term) {
22+
PrepareSqlFragments sqlFragments = PrepareSqlFragments.of();
23+
List<Object> idList = convertList(column, term);
24+
if (term.getOptions().contains("not")) {
25+
sqlFragments.addSql("not");
26+
}
27+
sqlFragments
28+
.addSql("exists(select 1 from ",getTableName("dev_product",column)," _product where _product.id = " + columnFullName);
29+
sqlFragments
30+
.addSql(" and _product.device_type in(");
31+
sqlFragments.addSql(idList.stream().map(str -> "?").collect(Collectors.joining(",")))
32+
.addParameter(idList)
33+
.addSql("))");
34+
35+
return sqlFragments;
36+
}
37+
}

0 commit comments

Comments
 (0)