Статьи

Руководство по InfluxDBMapper и QueryBuilder для Java Часть: 2

Ранее мы настраивали экземпляр InfluxDB, запускаемый через Docker, и запускали наш первый код InfluxDBMapper для базы данных InfluxDB.

Следующим шагом является выполнение некоторых запросов к infxdb с использованием QueryBuilder в сочетании с InfluxDBMapper.

Давайте начнем и выберите все из таблицы H2OFeetMeasurement.

01
02
03
04
05
06
07
08
09
10
private static final String DATABASE = "NOAA_water_database";
 
public static void main(String[] args) {
    InfluxDB influxDB = InfluxDBFactory.connect("http://localhost:8086", "root", "root");
 
    InfluxDBMapper influxDBMapper = new InfluxDBMapper(influxDB);
 
    Query query = select().from(DATABASE,"h2o_feet");
    List h2OFeetMeasurements = influxDBMapper.query(query, H2OFeetMeasurement.class);
}

Давайте уточним, выберем измерения с уровнем воды выше 8.

1
2
3
Query query = select().from(DATABASE,"h2o_feet").where(gt("water_level",8));
        LOGGER.info("Executing query "+query.getCommand());
        List higherThanMeasurements = influxDBMapper.query(query, H2OFeetMeasurement.class);

Могу поспорить, что вы заметили деталь query.getCommand (). Если вы хотите увидеть фактический выполняемый запрос, вы можете вызвать метод getCommand () из запроса.

Помимо операторов where мы можем выполнять определенные операции с такими полями, как вычисления.

1
2
3
Query query = select().op(op(cop("water_level",MUL,2),"+",4)).from(DATABASE,"h2o_feet");
        LOGGER.info("Executing query "+query.getCommand());
        QueryResult queryResult = influxDB.query(query);

Мы просто использовали функцию cop, чтобы умножить уровень воды на 2. Функция cop создает предложение, которое будет выполнять операцию над столбцом. Затем мы собираемся увеличить на 4 произведение предыдущей операции с помощью функции op. Функция op создает предложение, которое будет выполнять операцию в отношении двух заданных аргументов.

Следующим случаем является выбор с использованием определенного строкового поля ключ-значение

1
2
3
Query query = select().from(DATABASE,"h2o_feet").where(eq("location","santa_monica"));
        LOGGER.info("Executing query "+query.getCommand());
        List h2OFeetMeasurements = influxDBMapper.query(query, H2OFeetMeasurement.class);

Вещи могут стать еще более конкретными и выбрать данные, которые имеют определенные значения ключа поля и значения ключа тега.

1
2
3
4
5
6
7
8
Query query = select().column("water_level").from(DATABASE,"h2o_feet")
                              .where(neq("location","santa_monica"))
                              .andNested()
                              .and(lt("water_level",-0.59))
                              .or(gt("water_level",9.95))
                              .close();
        LOGGER.info("Executing query "+query.getCommand());
        List h2OFeetMeasurements = influxDBMapper.query(query, H2OFeetMeasurement.class);

Так как InfxDB — это база данных временных рядов, важно выпускать запросы с определенными временными метками.

1
2
3
4
Query query = select().from(DATABASE,"h2o_feet")
                              .where(gt("time",subTime(7,DAY)));
        LOGGER.info("Executing query "+query.getCommand());
        List h2OFeetMeasurements = influxDBMapper.query(query, H2OFeetMeasurement.class);

Наконец, что не менее важно, мы можем сделать запрос для определенных полей. Я создам модель только для полей, которые мы собираемся получить.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package com.gkatzioura.mapper.showcase;
 
import java.time.Instant;
import java.util.concurrent.TimeUnit;
 
import org.influxdb.annotation.Column;
import org.influxdb.annotation.Measurement;
 
@Measurement(name = "h2o_feet", timeUnit = TimeUnit.SECONDS)
public class LocationWithDescription {
 
    @Column(name = "time")
    private Instant time;
 
    @Column(name = "level description")
    private String levelDescription;
 
    @Column(name = "location")
    private String location;
 
    public Instant getTime() {
        return time;
    }
 
    public void setTime(Instant time) {
        this.time = time;
    }
 
    public String getLevelDescription() {
        return levelDescription;
    }
 
    public void setLevelDescription(String levelDescription) {
        this.levelDescription = levelDescription;
    }
 
    public String getLocation() {
        return location;
    }
 
    public void setLocation(String location) {
        this.location = location;
    }
}

И теперь я буду запрашивать их.

1
2
Query selectFields = select("level description","location").from(DATABASE,"h2o_feet");
List locationWithDescriptions = influxDBMapper.query(selectFields, LocationWithDescription.class);

Как вы можете видеть, мы также можем сопоставить определенные поля с моделью. На данный момент сопоставление с моделями может быть сделано только тогда, когда данные поступают из определенных измерений. Таким образом, в следующий раз мы перейдем к более конкретным примерам для разработчиков запросов.

Вы можете найти исходный код на github .

Опубликовано на Java Code Geeks с разрешения Эммануила Гкациоураса, партнера нашей программы JCG. См. Оригинальную статью здесь: Руководство по InfluxDBMapper и QueryBuilder для Java. Часть 2

Мнения, высказанные участниками Java Code Geeks, являются их собственными.