Bug Fix for DeviceSearch and Entity queries
This commit is contained in:
parent
d83d9ec3df
commit
2dd2cae91b
@ -333,8 +333,8 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository {
|
|||||||
if (pageLink.getPageSize() > 0) {
|
if (pageLink.getPageSize() > 0) {
|
||||||
dataQuery = String.format("%s limit %s offset %s", dataQuery, pageLink.getPageSize(), startIndex);
|
dataQuery = String.format("%s limit %s offset %s", dataQuery, pageLink.getPageSize(), startIndex);
|
||||||
}
|
}
|
||||||
// log.error("QUERY: {}", dataQuery);
|
log.error("QUERY: {}", dataQuery);
|
||||||
// Arrays.asList(ctx.getParameterNames()).forEach(param -> log.error("QUERY PARAM: {}->{}", param, ctx.getValue(param)));
|
Arrays.asList(ctx.getParameterNames()).forEach(param -> log.error("QUERY PARAM: {}->{}", param, ctx.getValue(param)));
|
||||||
List<Map<String, Object>> rows = jdbcTemplate.queryForList(dataQuery, ctx);
|
List<Map<String, Object>> rows = jdbcTemplate.queryForList(dataQuery, ctx);
|
||||||
return EntityDataAdapter.createEntityData(pageLink, selectionMapping, rows, totalElements);
|
return EntityDataAdapter.createEntityData(pageLink, selectionMapping, rows, totalElements);
|
||||||
});
|
});
|
||||||
@ -432,7 +432,12 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository {
|
|||||||
String lvlFilter = getLvlFilter(entityFilter.getMaxLevel());
|
String lvlFilter = getLvlFilter(entityFilter.getMaxLevel());
|
||||||
String selectFields = "SELECT tenant_id, customer_id, id, created_time, type, name, label FROM " + entityType.name() + " WHERE id in ( SELECT entity_id";
|
String selectFields = "SELECT tenant_id, customer_id, id, created_time, type, name, label FROM " + entityType.name() + " WHERE id in ( SELECT entity_id";
|
||||||
String from = getQueryTemplate(entityFilter.getDirection());
|
String from = getQueryTemplate(entityFilter.getDirection());
|
||||||
String whereFilter = " WHERE re.relation_type = :where_relation_type AND re.to_type = :where_entity_type";
|
String whereFilter = " WHERE";
|
||||||
|
if (!StringUtils.isEmpty(entityFilter.getRelationType())) {
|
||||||
|
ctx.addStringParameter("where_relation_type", entityFilter.getRelationType());
|
||||||
|
whereFilter += " re.relation_type = :where_relation_type AND";
|
||||||
|
}
|
||||||
|
whereFilter += " re.to_type = :where_entity_type";
|
||||||
|
|
||||||
from = String.format(from, lvlFilter, whereFilter);
|
from = String.format(from, lvlFilter, whereFilter);
|
||||||
String query = "( " + selectFields + from + ")";
|
String query = "( " + selectFields + from + ")";
|
||||||
@ -443,7 +448,6 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository {
|
|||||||
query += " )";
|
query += " )";
|
||||||
ctx.addUuidParameter("relation_root_id", rootId.getId());
|
ctx.addUuidParameter("relation_root_id", rootId.getId());
|
||||||
ctx.addStringParameter("relation_root_type", rootId.getEntityType().name());
|
ctx.addStringParameter("relation_root_type", rootId.getEntityType().name());
|
||||||
ctx.addStringParameter("where_relation_type", entityFilter.getRelationType());
|
|
||||||
ctx.addStringParameter("where_entity_type", entityType.name());
|
ctx.addStringParameter("where_entity_type", entityType.name());
|
||||||
return query;
|
return query;
|
||||||
}
|
}
|
||||||
@ -465,36 +469,27 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository {
|
|||||||
|
|
||||||
StringBuilder whereFilter;
|
StringBuilder whereFilter;
|
||||||
if (entityFilter.getFilters() != null && !entityFilter.getFilters().isEmpty()) {
|
if (entityFilter.getFilters() != null && !entityFilter.getFilters().isEmpty()) {
|
||||||
whereFilter = new StringBuilder(" WHERE ");
|
whereFilter = new StringBuilder();
|
||||||
boolean first = true;
|
boolean first = true;
|
||||||
boolean single = entityFilter.getFilters().size() == 1;
|
boolean single = entityFilter.getFilters().size() == 1;
|
||||||
int entityTypeFilterIdx = 0;
|
int entityTypeFilterIdx = 0;
|
||||||
for (EntityTypeFilter etf : entityFilter.getFilters()) {
|
for (EntityTypeFilter etf : entityFilter.getFilters()) {
|
||||||
if (first) {
|
String etfCondition = buildEtfCondition(ctx, etf, entityFilter.getDirection(), entityTypeFilterIdx++);
|
||||||
first = false;
|
if (!etfCondition.isEmpty()) {
|
||||||
} else {
|
if (first) {
|
||||||
whereFilter.append(" AND ");
|
whereFilter.append(" WHERE ");
|
||||||
|
first = false;
|
||||||
|
} else {
|
||||||
|
whereFilter.append(" AND ");
|
||||||
|
}
|
||||||
|
if (!single) {
|
||||||
|
whereFilter.append(" (");
|
||||||
|
}
|
||||||
|
whereFilter.append(etfCondition);
|
||||||
|
if (!single) {
|
||||||
|
whereFilter.append(" )");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
String relationType = etf.getRelationType();
|
|
||||||
if (!single) {
|
|
||||||
whereFilter.append(" (");
|
|
||||||
}
|
|
||||||
List<String> whereEntityTypes = etf.getEntityTypes().stream().map(EntityType::name).collect(Collectors.toList());
|
|
||||||
whereFilter
|
|
||||||
.append(" re.relation_type = :where_relation_type").append(entityTypeFilterIdx);
|
|
||||||
if (!whereEntityTypes.isEmpty()) {
|
|
||||||
whereFilter.append(" and re.")
|
|
||||||
.append(entityFilter.getDirection().equals(EntitySearchDirection.FROM) ? "to" : "from")
|
|
||||||
.append("_type in (:where_entity_types").append(entityTypeFilterIdx).append(")");
|
|
||||||
}
|
|
||||||
if (!single) {
|
|
||||||
whereFilter.append(" )");
|
|
||||||
}
|
|
||||||
ctx.addStringParameter("where_relation_type" + entityTypeFilterIdx, relationType);
|
|
||||||
if (!whereEntityTypes.isEmpty()) {
|
|
||||||
ctx.addStringListParameter("where_entity_types" + entityTypeFilterIdx, whereEntityTypes);
|
|
||||||
}
|
|
||||||
entityTypeFilterIdx++;
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
whereFilter = new StringBuilder();
|
whereFilter = new StringBuilder();
|
||||||
@ -503,6 +498,34 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository {
|
|||||||
return "( " + selectFields + from + ")";
|
return "( " + selectFields + from + ")";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String buildEtfCondition(QueryContext ctx, EntityTypeFilter etf, EntitySearchDirection direction, int entityTypeFilterIdx) {
|
||||||
|
StringBuilder whereFilter = new StringBuilder();
|
||||||
|
String relationType = etf.getRelationType();
|
||||||
|
List<EntityType> entityTypes = etf.getEntityTypes();
|
||||||
|
List<String> whereEntityTypes;
|
||||||
|
if (entityTypes == null || entityTypes.isEmpty()) {
|
||||||
|
whereEntityTypes = Collections.emptyList();
|
||||||
|
} else {
|
||||||
|
whereEntityTypes = etf.getEntityTypes().stream().map(EntityType::name).collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
boolean hasRelationType = !StringUtils.isEmpty(relationType);
|
||||||
|
if (hasRelationType) {
|
||||||
|
ctx.addStringParameter("where_relation_type" + entityTypeFilterIdx, relationType);
|
||||||
|
whereFilter
|
||||||
|
.append("re.relation_type = :where_relation_type").append(entityTypeFilterIdx);
|
||||||
|
}
|
||||||
|
if (!whereEntityTypes.isEmpty()) {
|
||||||
|
if (hasRelationType) {
|
||||||
|
whereFilter.append(" and ");
|
||||||
|
}
|
||||||
|
whereFilter.append("re.")
|
||||||
|
.append(direction.equals(EntitySearchDirection.FROM) ? "to" : "from")
|
||||||
|
.append("_type in (:where_entity_types").append(entityTypeFilterIdx).append(")");
|
||||||
|
ctx.addStringListParameter("where_entity_types" + entityTypeFilterIdx, whereEntityTypes);
|
||||||
|
}
|
||||||
|
return whereFilter.toString();
|
||||||
|
}
|
||||||
|
|
||||||
private String getLvlFilter(int maxLevel) {
|
private String getLvlFilter(int maxLevel) {
|
||||||
return maxLevel > 0 ? ("and lvl <= " + (maxLevel - 1)) : "";
|
return maxLevel > 0 ? ("and lvl <= " + (maxLevel - 1)) : "";
|
||||||
}
|
}
|
||||||
|
|||||||
@ -15,6 +15,7 @@
|
|||||||
*/
|
*/
|
||||||
package org.thingsboard.server.dao.sql.query;
|
package org.thingsboard.server.dao.sql.query;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.hibernate.type.PostgresUUIDType;
|
import org.hibernate.type.PostgresUUIDType;
|
||||||
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
|
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
|
||||||
import org.thingsboard.server.common.data.EntityType;
|
import org.thingsboard.server.common.data.EntityType;
|
||||||
@ -27,6 +28,7 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
public class QueryContext implements SqlParameterSource {
|
public class QueryContext implements SqlParameterSource {
|
||||||
private static final PostgresUUIDType UUID_TYPE = new PostgresUUIDType();
|
private static final PostgresUUIDType UUID_TYPE = new PostgresUUIDType();
|
||||||
|
|
||||||
@ -43,9 +45,12 @@ public class QueryContext implements SqlParameterSource {
|
|||||||
void addParameter(String name, Object value, int type, String typeName) {
|
void addParameter(String name, Object value, int type, String typeName) {
|
||||||
Parameter newParam = new Parameter(value, type, typeName);
|
Parameter newParam = new Parameter(value, type, typeName);
|
||||||
Parameter oldParam = params.put(name, newParam);
|
Parameter oldParam = params.put(name, newParam);
|
||||||
if (oldParam != null && !oldParam.value.equals(newParam.value)) {
|
if (oldParam != null && oldParam.value != null && !oldParam.value.equals(newParam.value)) {
|
||||||
throw new RuntimeException("Parameter with name: " + name + " was already registered!");
|
throw new RuntimeException("Parameter with name: " + name + " was already registered!");
|
||||||
}
|
}
|
||||||
|
if(value == null){
|
||||||
|
log.warn("[{}][{}][{}] Trying to set null value", getTenantId(), getCustomerId(), name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void append(String s) {
|
public void append(String s) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user