Статьи

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

Ранее мы выполнили несколько примеров выбора и агрегатов для базы данных InfluxDB. В этом руководстве мы собираемся проверить группу по функциональности, которую нам предоставляет Query Builder.

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

Предположим, что мы хотим сгруппировать по одному тегу, мы будем использовать функцию groupBy.

1
2
3
Query query = select().mean("water_level").from(DATABASE, "h2o_feet").groupBy("location");
        LOGGER.info("Executing query "+query.getCommand());
        QueryResult queryResult = influxDB.query(query);

Запрашиваемый запрос должен быть

1
SELECT MEAN(water_level) FROM h2o_feet GROUP BY location;

Если мы хотим сгруппировать по нескольким тегам, мы передадим массив тегов.

1
2
3
4
Query query = select().mean("index").from(DATABASE,"h2o_feet")
                              .groupBy("location","randtag");
        LOGGER.info("Executing query "+query.getCommand());
        QueryResult queryResult = influxDB.query(query);

Результат будет

1
SELECT MEAN(index) FROM h2o_feet GROUP BY location,randtag;

Другим вариантом является запрос по всем тегам.

1
2
3
4
Query query = select().mean("index").from(DATABASE,"h2o_feet")
                              .groupBy(raw("*"));
        LOGGER.info("Executing query "+query.getCommand());
        QueryResult queryResult = influxDB.query(query);
1
SELECT MEAN(index) FROM h2o_feet GROUP BY *;

Поскольку InfluxDB — это база данных временных рядов, у нас есть отличная группировка по функциональности, основанная на времени.

Например, давайте сгруппируем результаты запроса в 12-минутные интервалы

1
2
3
4
5
6
7
Query query = select().count("water_level").from(DATABASE,"h2o_feet")
                              .where(eq("location","coyote_creek"))
                              .and(gte("time","2015-08-18T00:00:00Z"))
                              .and(lte("time","2015-08-18T00:30:00Z"))
                              .groupBy(time(12l,MINUTE));
        LOGGER.info("Executing query "+query.getCommand());
        QueryResult queryResult = influxDB.query(query);

Мы получаем результат

1
SELECT COUNT(water_level) FROM h2o_feet WHERE location = 'coyote_creek' AND time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z' GROUP BY time(12m);

Группируйте результаты по 12-минутным интервалам и расположению.

1
2
3
4
5
6
7
Query query = select().count("water_level").from(DATABASE,"h2o_feet")
                              .where()
                              .and(gte("time","2015-08-18T00:00:00Z"))
                              .and(lte("time","2015-08-18T00:30:00Z"))
                              .groupBy(time(12l,MINUTE),"location");
        LOGGER.info("Executing query "+query.getCommand());
        QueryResult queryResult = influxDB.query(query);

Мы получаем следующий запрос.

1
SELECT COUNT(water_level) FROM h2o_feet WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z' GROUP BY time(12m),location;

Мы получим более сложные и сгруппированные результаты запросов по 18-минутным интервалам и сместим заданные временные границы вперед.

1
2
3
4
5
6
7
Query query = select().mean("water_level").from(DATABASE,"h2o_feet")
                              .where(eq("location","coyote_creek"))
                              .and(gte("time","2015-08-18T00:06:00Z"))
                              .and(lte("time","2015-08-18T00:54:00Z"))
                              .groupBy(time(18l,MINUTE,6l,MINUTE));
        LOGGER.info("Executing query "+query.getCommand());
        QueryResult queryResult = influxDB.query(query);
1
SELECT MEAN(water_level) FROM h2o_feet WHERE location = 'coyote_creek' AND time >= '2015-08-18T00:06:00Z' AND time <= '2015-08-18T00:54:00Z' GROUP BY time(18m,6m);

Или сгруппируйте результаты запроса в 12-минутные интервалы и сдвиньте заданные временные границы назад;

1
2
3
4
5
6
7
Query query = select().mean("water_level").from(DATABASE,"h2o_feet")
                              .where(eq("location","coyote_creek"))
                              .and(gte("time","2015-08-18T00:06:00Z"))
                              .and(lte("time","2015-08-18T00:54:00Z"))
                              .groupBy(time(18l,MINUTE,-12l,MINUTE));
        LOGGER.info("Executing query "+query.getCommand());
        QueryResult queryResult = influxDB.query(query);

Результат будет

1
SELECT MEAN(water_level) FROM h2o_feet WHERE location = 'coyote_creek' AND time >= '2015-08-18T00:06:00Z' AND time <= '2015-08-18T00:54:00Z' GROUP BY time(18m,-12m);

В конце концов мы можем сгруппировать и заполнить

1
2
3
4
5
6
7
8
Query query = select()
                .column("water_level")
                .from(DATABASE, "h2o_feet")
                .where(gt("time", op(ti(24043524l, MINUTE), SUB, ti(6l, MINUTE))))
                .groupBy("water_level")
                .fill(100);
        LOGGER.info("Executing query "+query.getCommand());
        QueryResult queryResult = influxDB.query(query);

Результат будет

1
SELECT water_level FROM h2o_feet WHERE time > 24043524m - 6m GROUP BY water_level fill(100);

Это оно! Мы просто запускаем действительно сложную группу по запросам к нашей базе данных InfluxDB. Конструктор запросов позволяет создавать запросы, используя только Java.
Вы можете найти исходный код в github .

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

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