Ранее мы выполнили несколько примеров выбора и агрегатов для базы данных 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, являются их собственными. |