From 682c15cfe1d533b5bb9526a6081063aeefb92896 Mon Sep 17 00:00:00 2001 From: Andrii Shvaika Date: Tue, 28 Jul 2020 15:05:31 +0300 Subject: [PATCH] Test Fix --- application/src/main/resources/thingsboard.yml | 2 ++ .../sql/query/DefaultAlarmQueryRepository.java | 9 +++++++++ .../query/DefaultEntityQueryRepository.java | 18 +++++++++++++----- .../server/dao/sql/query/EntityKeyMapping.java | 4 ++-- dao/src/test/resources/sql-test.properties | 4 +++- 5 files changed, 29 insertions(+), 8 deletions(-) diff --git a/application/src/main/resources/thingsboard.yml b/application/src/main/resources/thingsboard.yml index 57906eed51..a482f4a219 100644 --- a/application/src/main/resources/thingsboard.yml +++ b/application/src/main/resources/thingsboard.yml @@ -272,6 +272,8 @@ sql: batch_threads: "${SQL_TS_LATEST_BATCH_THREADS:4}" # Specify whether to remove null characters from strValue of attributes and timeseries before insert remove_null_chars: "${SQL_REMOVE_NULL_CHARS:true}" + # Specify whether to log database queries and their parameters generated by entity query repository + log_entity_queries: "${SQL_LOG_ENTITY_QUERIES:false}" postgres: # Specify partitioning size for timestamp key-value storage. Example: DAYS, MONTHS, YEARS, INDEFINITE. ts_key_value_partitioning: "${SQL_POSTGRES_TS_KV_PARTITIONING:MONTHS}" diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultAlarmQueryRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultAlarmQueryRepository.java index ea8e408713..daa9883eac 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultAlarmQueryRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultAlarmQueryRepository.java @@ -18,6 +18,7 @@ package org.thingsboard.server.dao.sql.query; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.stereotype.Repository; import org.springframework.transaction.TransactionStatus; @@ -41,6 +42,7 @@ import org.thingsboard.server.dao.model.ModelConstants; import org.thingsboard.server.dao.util.SqlDao; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; @@ -114,6 +116,9 @@ public class DefaultAlarmQueryRepository implements AlarmQueryRepository { protected final NamedParameterJdbcTemplate jdbcTemplate; private final TransactionTemplate transactionTemplate; + @Value("${sql.log_entity_queries:false}") + private boolean logSqlQueries; + public DefaultAlarmQueryRepository(NamedParameterJdbcTemplate jdbcTemplate, TransactionTemplate transactionTemplate) { this.jdbcTemplate = jdbcTemplate; this.transactionTemplate = transactionTemplate; @@ -237,6 +242,10 @@ public class DefaultAlarmQueryRepository implements AlarmQueryRepository { dataQuery = String.format("%s limit %s offset %s", dataQuery, pageLink.getPageSize(), startIndex); } List> rows = jdbcTemplate.queryForList(dataQuery, ctx); + if (logSqlQueries) { + log.error("QUERY: {}", dataQuery); + Arrays.asList(ctx.getParameterNames()).forEach(param -> log.error("QUERY PARAM: {}->{}", param, ctx.getValue(param))); + } return AlarmDataAdapter.createAlarmData(pageLink, rows, totalElements, orderedEntityIds); }); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultEntityQueryRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultEntityQueryRepository.java index f6ce1f3583..f464a3174e 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultEntityQueryRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultEntityQueryRepository.java @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -18,6 +18,7 @@ package org.thingsboard.server.dao.sql.query; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.stereotype.Repository; import org.springframework.transaction.TransactionStatus; @@ -223,6 +224,9 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { private final NamedParameterJdbcTemplate jdbcTemplate; private final TransactionTemplate transactionTemplate; + @Value("${sql.log_entity_queries:false}") + private boolean logSqlQueries; + public DefaultEntityQueryRepository(NamedParameterJdbcTemplate jdbcTemplate, TransactionTemplate transactionTemplate) { this.jdbcTemplate = jdbcTemplate; this.transactionTemplate = transactionTemplate; @@ -236,8 +240,10 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { ctx.append(addEntityTableQuery(ctx, query.getEntityFilter())); ctx.append(" e where "); ctx.append(buildEntityWhere(ctx, query.getEntityFilter(), Collections.emptyList())); -// log.error("QUERY: {}", ctx.getQuery()); -// Arrays.asList(ctx.getParameterNames()).forEach(param -> log.error("QUERY PARAM: {}->{}", param, ctx.getValue(param))); + if (logSqlQueries) { + log.info("QUERY: {}", ctx.getQuery()); + Arrays.asList(ctx.getParameterNames()).forEach(param -> log.info("QUERY PARAM: {}->{}", param, ctx.getValue(param))); + } return transactionTemplate.execute(status -> jdbcTemplate.queryForObject(ctx.getQuery(), ctx, Long.class)); } @@ -331,8 +337,10 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { if (pageLink.getPageSize() > 0) { dataQuery = String.format("%s limit %s offset %s", dataQuery, pageLink.getPageSize(), startIndex); } -// log.error("QUERY: {}", dataQuery); -// Arrays.asList(ctx.getParameterNames()).forEach(param -> log.error("QUERY PARAM: {}->{}", param, ctx.getValue(param))); + if (logSqlQueries) { + log.error("QUERY: {}", dataQuery); + Arrays.asList(ctx.getParameterNames()).forEach(param -> log.error("QUERY PARAM: {}->{}", param, ctx.getValue(param))); + } List> rows = jdbcTemplate.queryForList(dataQuery, ctx); return EntityDataAdapter.createEntityData(pageLink, selectionMapping, rows, totalElements); }); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/query/EntityKeyMapping.java b/dao/src/main/java/org/thingsboard/server/dao/sql/query/EntityKeyMapping.java index b9c0bc1654..b22f093955 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/query/EntityKeyMapping.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/query/EntityKeyMapping.java @@ -245,13 +245,13 @@ public class EntityKeyMapping { filterQuery = " AND (" + filterQuery + ")"; } if (entityKey.getType().equals(EntityKeyType.TIME_SERIES)) { - String join = hasFilter() ? "left join" : "left outer join"; + String join = hasFilter() ? "inner join" : "left join"; return String.format("%s ts_kv_latest %s ON %s.entity_id=entities.id AND %s.key = (select key_id from ts_kv_dictionary where key = :%s_key_id) %s", join, alias, alias, alias, alias, filterQuery); } else { String query; if (!entityKey.getType().equals(EntityKeyType.ATTRIBUTE)) { - String join = hasFilter() ? "left join" : "left outer join"; + String join = hasFilter() ? "inner join" : "left join"; query = String.format("%s attribute_kv %s ON %s.entity_id=entities.id AND %s.entity_type=%s AND %s.attribute_key=:%s_key_id ", join, alias, alias, alias, entityTypeStr, alias, alias); String scope; diff --git a/dao/src/test/resources/sql-test.properties b/dao/src/test/resources/sql-test.properties index b353bcc048..11ca8b8daf 100644 --- a/dao/src/test/resources/sql-test.properties +++ b/dao/src/test/resources/sql-test.properties @@ -46,4 +46,6 @@ queue.rule-engine.queues[0].poll-interval=25 queue.rule-engine.queues[0].partitions=3 queue.rule-engine.queues[0].pack-processing-timeout=3000 queue.rule-engine.queues[0].processing-strategy.type=SKIP_ALL_FAILURES -queue.rule-engine.queues[0].submit-strategy.type=BURST \ No newline at end of file +queue.rule-engine.queues[0].submit-strategy.type=BURST + +sql.log_entity_queries=true \ No newline at end of file