@InfluxColumn为自定义注解,用于拼接查询语句构造map函数使用
@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.FIELD)public @interface InfluxColumn { String value();}@Datapublic class MonDataDTO { // tag1名称 @InfluxColumn("pointName") private String pointName; // tag2名称 @InfluxColumn("indexName") private String indexName; // 时间片开始时间 @InfluxColumn("_start") private String start; // 时间片结束时间 @InfluxColumn("_stop") private String stop; // 数据产生时间 @InfluxColumn("_time") private String time; // 值 @InfluxColumn("_value") private String value;}@Datapublic class SearchParams<T> { // 查询时间范围开始时间 private String start; // 时间戳字段排序规则,true:降序 private Boolean sortRule = true; // 查询时间范围结束时间 private String end; // 时间间隔 private String every; // 筛选条件 private List<String> filterList; // map构造的目标类对象 private Class<? extends T> mapClazz;}功能类@Repository@Slf4jpublic class InfluxRepository { @Autowired private WriteApi writeApi; @Autowired private QueryApi queryApi; @Autowired private InfluxdbConfigProp influxdbConfigProp; /** * 向influx写入数据 * * @param data 写入数据实体 */ public <T> void writeData(T data) { writeApi.writeMeasurement( influxdbConfigProp.getBucket(), influxdbConfigProp.getOrg(), WritePrecision.MS, data); } /** * 查询数据 * * @param params 查询参数 */ public <T> List<FluxTable> findMonitoringData(SearchParams<T> params) { StringBuffer queryBuffer = new StringBuffer(); // BUCKET queryBuffer.append("from(bucket: \""); queryBuffer.append(influxdbConfigProp.getBucket()); // 时间范围条件 queryBuffer.append("\") \n|> range(start: "); queryBuffer.append(params.getStart()); queryBuffer.append(", stop: "); queryBuffer.append(params.getEnd()); queryBuffer.append(")\n"); List<String> filterList = params.getFilterList(); if (!CollectionUtils.isEmpty(filterList)) { queryBuffer.append(" |> filter(fn: (r) => "); // 拼接查询条件 for (int i = 0; i < filterList.size(); i++) { String[] filters = filterList.get(i).split(">"); queryBuffer.append("r[\""); queryBuffer.append(filters[0]); queryBuffer.append("\"]"); queryBuffer.append(filters[1]); if (i < filterList.size() - 1) queryBuffer.append(" and "); } queryBuffer.append(")\n"); } // aggregateWindow函数 queryBuffer.append(" |> aggregateWindow(every: "); queryBuffer.append(params.getEvery()); queryBuffer.append(",fn: first, createEmpty: true)\n"); // 为查询结果添加排序 queryBuffer.append(" |> sort(columns: [\"_time\"], desc: "); queryBuffer.append(params.getSortRule().booleanValue()); queryBuffer.append(")\n"); // map函数语句拼接 Class<? extends T> mapClazz = params.getMapClazz(); if (!ObjectUtils.isEmpty(mapClazz)) { queryBuffer.append(" |> map("); queryBuffer.append(" fn:(r) => { \n"); queryBuffer.append(" return {\n"); Field[] fields = mapClazz.getDeclaredFields(); // 目标实体字段和influx查询结果字段的映射 Map<String, String> fieldMap = new HashMap<>(); for (Field field : fields) { InfluxColumn influxColumn = field.getAnnotation(InfluxColumn.class); if (influxColumn != null) { fieldMap.put(field.getName(), influxColumn.value()); } } // 若有需要映射的字段则构建语句 if (!CollectionUtils.isEmpty(fieldMap)) { for (String key : fieldMap.keySet()) { queryBuffer.append(key); queryBuffer.append(": r[\""); queryBuffer.append(fieldMap.get(key)); queryBuffer.append("\"],\n"); } queryBuffer.append("}})\n"); } } String influxQl = queryBuffer.toString(); log.info("查询语句, {}", influxQl); List<FluxTable> queryData = queryApi.query(influxQl, influxdbConfigProp.getOrg()); return queryData; }}
经验总结扩展阅读
- 2023年10月安装柱子黄道吉日 2023年10月哪天适合安装柱子
- 爱情树怎么养的
- Deepin系统navicat15安装
- 2023年农历九月初八安装房门吉日 2023年10月22日适合安装房门吗
- 2023年10月22日安装柱子黄道吉日 2023年10月22日安装柱子吉日一览表
- 2023年10月22日安装门户行吗 2023年10月22日适合安装门户吗
- 2023年农历九月初八宜安装门框吗 2023年10月22日安装门框黄道吉日
- 2023年农历九月初八安装家电吉日 2023年10月22日适合安装家电吗
- 2023年10月22日安装窗帘黄道吉日 2023年10月22日安装窗帘行吗
- 2023年10月22日是安装机器的黄道吉日吗 2023年10月22日安装机器好吗