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