Merge pull request #8620 from thingsboard/refactoring_serch_text_device
Removed search text from Device Entity
This commit is contained in:
commit
2a0f5479a0
@ -720,6 +720,14 @@ public class SqlDatabaseUpgradeService implements DatabaseEntitiesUpgradeService
|
|||||||
if (isOldSchema(conn, 3005000)) {
|
if (isOldSchema(conn, 3005000)) {
|
||||||
schemaUpdateFile = Paths.get(installScripts.getDataDir(), "upgrade", "3.5.1", SCHEMA_UPDATE_SQL);
|
schemaUpdateFile = Paths.get(installScripts.getDataDir(), "upgrade", "3.5.1", SCHEMA_UPDATE_SQL);
|
||||||
loadSql(schemaUpdateFile, conn);
|
loadSql(schemaUpdateFile, conn);
|
||||||
|
|
||||||
|
try {
|
||||||
|
String[] entityNames = new String[]{"device"};
|
||||||
|
for (String entityName : entityNames) {
|
||||||
|
conn.createStatement().execute("ALTER TABLE " + entityName + " DROP COLUMN search_text CASCADE");
|
||||||
|
}
|
||||||
|
} catch (Exception e) {}
|
||||||
|
|
||||||
conn.createStatement().execute("UPDATE tb_schema_settings SET schema_version = 3005002;");
|
conn.createStatement().execute("UPDATE tb_schema_settings SET schema_version = 3005002;");
|
||||||
}
|
}
|
||||||
log.info("Schema updated.");
|
log.info("Schema updated.");
|
||||||
|
|||||||
@ -0,0 +1,108 @@
|
|||||||
|
/**
|
||||||
|
* Copyright © 2016-2023 The Thingsboard Authors
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* 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
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.thingsboard.server.common.data;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||||
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||||
|
import com.fasterxml.jackson.databind.JsonNode;
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.thingsboard.server.common.data.id.UUIDBased;
|
||||||
|
import org.thingsboard.server.common.data.validation.NoXss;
|
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by ashvayka on 19.02.18.
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
public abstract class BaseDataWithAdditionalInfo<I extends UUIDBased> extends BaseData<I> implements HasAdditionalInfo {
|
||||||
|
|
||||||
|
public static final ObjectMapper mapper = new ObjectMapper();
|
||||||
|
@NoXss
|
||||||
|
private transient JsonNode additionalInfo;
|
||||||
|
@JsonIgnore
|
||||||
|
private byte[] additionalInfoBytes;
|
||||||
|
|
||||||
|
public BaseDataWithAdditionalInfo() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public BaseDataWithAdditionalInfo(I id) {
|
||||||
|
super(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public BaseDataWithAdditionalInfo(BaseDataWithAdditionalInfo<I> baseData) {
|
||||||
|
super(baseData);
|
||||||
|
setAdditionalInfo(baseData.getAdditionalInfo());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JsonNode getAdditionalInfo() {
|
||||||
|
return getJson(() -> additionalInfo, () -> additionalInfoBytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAdditionalInfo(JsonNode addInfo) {
|
||||||
|
setJson(addInfo, json -> this.additionalInfo = json, bytes -> this.additionalInfoBytes = bytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (this == o) return true;
|
||||||
|
if (o == null || getClass() != o.getClass()) return false;
|
||||||
|
if (!super.equals(o)) return false;
|
||||||
|
BaseDataWithAdditionalInfo<?> that = (BaseDataWithAdditionalInfo<?>) o;
|
||||||
|
return Arrays.equals(additionalInfoBytes, that.additionalInfoBytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hash(super.hashCode(), additionalInfoBytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static JsonNode getJson(Supplier<JsonNode> jsonData, Supplier<byte[]> binaryData) {
|
||||||
|
JsonNode json = jsonData.get();
|
||||||
|
if (json != null) {
|
||||||
|
return json;
|
||||||
|
} else {
|
||||||
|
byte[] data = binaryData.get();
|
||||||
|
if (data != null) {
|
||||||
|
try {
|
||||||
|
return mapper.readTree(new ByteArrayInputStream(data));
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.warn("Can't deserialize json data: ", e);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setJson(JsonNode json, Consumer<JsonNode> jsonConsumer, Consumer<byte[]> bytesConsumer) {
|
||||||
|
jsonConsumer.accept(json);
|
||||||
|
try {
|
||||||
|
bytesConsumer.accept(mapper.writeValueAsBytes(json));
|
||||||
|
} catch (JsonProcessingException e) {
|
||||||
|
log.warn("Can't serialize json data: ", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -40,7 +40,7 @@ import java.util.Optional;
|
|||||||
@ApiModel
|
@ApiModel
|
||||||
@EqualsAndHashCode(callSuper = true)
|
@EqualsAndHashCode(callSuper = true)
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class Device extends SearchTextBasedWithAdditionalInfo<DeviceId> implements HasLabel, HasTenantId, HasCustomerId, HasOtaPackage, ExportableEntity<DeviceId> {
|
public class Device extends BaseDataWithAdditionalInfo<DeviceId> implements HasLabel, HasTenantId, HasCustomerId, HasOtaPackage, ExportableEntity<DeviceId> {
|
||||||
|
|
||||||
private static final long serialVersionUID = 2807343040519543363L;
|
private static final long serialVersionUID = 2807343040519543363L;
|
||||||
|
|
||||||
@ -201,11 +201,6 @@ public class Device extends SearchTextBasedWithAdditionalInfo<DeviceId> implemen
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSearchText() {
|
|
||||||
return getName();
|
|
||||||
}
|
|
||||||
|
|
||||||
@ApiModelProperty(position = 10, value = "JSON object with Ota Package Id.")
|
@ApiModelProperty(position = 10, value = "JSON object with Ota Package Id.")
|
||||||
public OtaPackageId getFirmwareId() {
|
public OtaPackageId getFirmwareId() {
|
||||||
return firmwareId;
|
return firmwareId;
|
||||||
|
|||||||
@ -32,7 +32,6 @@ import org.thingsboard.server.common.data.id.OtaPackageId;
|
|||||||
import org.thingsboard.server.common.data.id.TenantId;
|
import org.thingsboard.server.common.data.id.TenantId;
|
||||||
import org.thingsboard.server.dao.model.BaseSqlEntity;
|
import org.thingsboard.server.dao.model.BaseSqlEntity;
|
||||||
import org.thingsboard.server.dao.model.ModelConstants;
|
import org.thingsboard.server.dao.model.ModelConstants;
|
||||||
import org.thingsboard.server.dao.model.SearchTextEntity;
|
|
||||||
import org.thingsboard.server.dao.util.mapping.JsonBinaryType;
|
import org.thingsboard.server.dao.util.mapping.JsonBinaryType;
|
||||||
import org.thingsboard.server.dao.util.mapping.JsonStringType;
|
import org.thingsboard.server.dao.util.mapping.JsonStringType;
|
||||||
|
|
||||||
@ -47,7 +46,7 @@ import java.util.UUID;
|
|||||||
@TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)
|
@TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)
|
||||||
})
|
})
|
||||||
@MappedSuperclass
|
@MappedSuperclass
|
||||||
public abstract class AbstractDeviceEntity<T extends Device> extends BaseSqlEntity<T> implements SearchTextEntity<T> {
|
public abstract class AbstractDeviceEntity<T extends Device> extends BaseSqlEntity<T> {
|
||||||
|
|
||||||
@Column(name = ModelConstants.DEVICE_TENANT_ID_PROPERTY, columnDefinition = "uuid")
|
@Column(name = ModelConstants.DEVICE_TENANT_ID_PROPERTY, columnDefinition = "uuid")
|
||||||
private UUID tenantId;
|
private UUID tenantId;
|
||||||
@ -64,9 +63,6 @@ public abstract class AbstractDeviceEntity<T extends Device> extends BaseSqlEnti
|
|||||||
@Column(name = ModelConstants.DEVICE_LABEL_PROPERTY)
|
@Column(name = ModelConstants.DEVICE_LABEL_PROPERTY)
|
||||||
private String label;
|
private String label;
|
||||||
|
|
||||||
@Column(name = ModelConstants.SEARCH_TEXT_PROPERTY)
|
|
||||||
private String searchText;
|
|
||||||
|
|
||||||
@Type(type = "json")
|
@Type(type = "json")
|
||||||
@Column(name = ModelConstants.DEVICE_ADDITIONAL_INFO_PROPERTY)
|
@Column(name = ModelConstants.DEVICE_ADDITIONAL_INFO_PROPERTY)
|
||||||
private JsonNode additionalInfo;
|
private JsonNode additionalInfo;
|
||||||
@ -131,23 +127,12 @@ public abstract class AbstractDeviceEntity<T extends Device> extends BaseSqlEnti
|
|||||||
this.type = deviceEntity.getType();
|
this.type = deviceEntity.getType();
|
||||||
this.name = deviceEntity.getName();
|
this.name = deviceEntity.getName();
|
||||||
this.label = deviceEntity.getLabel();
|
this.label = deviceEntity.getLabel();
|
||||||
this.searchText = deviceEntity.getSearchText();
|
|
||||||
this.additionalInfo = deviceEntity.getAdditionalInfo();
|
this.additionalInfo = deviceEntity.getAdditionalInfo();
|
||||||
this.firmwareId = deviceEntity.getFirmwareId();
|
this.firmwareId = deviceEntity.getFirmwareId();
|
||||||
this.softwareId = deviceEntity.getSoftwareId();
|
this.softwareId = deviceEntity.getSoftwareId();
|
||||||
this.externalId = deviceEntity.getExternalId();
|
this.externalId = deviceEntity.getExternalId();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSearchTextSource() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setSearchText(String searchText) {
|
|
||||||
this.searchText = searchText;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected Device toDevice() {
|
protected Device toDevice() {
|
||||||
Device device = new Device(new DeviceId(getUuid()));
|
Device device = new Device(new DeviceId(getUuid()));
|
||||||
device.setCreatedTime(createdTime);
|
device.setCreatedTime(createdTime);
|
||||||
|
|||||||
@ -35,27 +35,30 @@ public interface DeviceRepository extends JpaRepository<DeviceEntity, UUID>, Exp
|
|||||||
|
|
||||||
@Query("SELECT d FROM DeviceEntity d WHERE d.tenantId = :tenantId " +
|
@Query("SELECT d FROM DeviceEntity d WHERE d.tenantId = :tenantId " +
|
||||||
"AND d.customerId = :customerId " +
|
"AND d.customerId = :customerId " +
|
||||||
"AND LOWER(d.searchText) LIKE LOWER(CONCAT('%', :searchText, '%'))")
|
"AND (LOWER(d.name) LIKE LOWER(CONCAT('%', :textSearch, '%')) " +
|
||||||
|
"OR LOWER(d.label) LIKE LOWER(CONCAT('%', :textSearch, '%')))")
|
||||||
Page<DeviceEntity> findByTenantIdAndCustomerId(@Param("tenantId") UUID tenantId,
|
Page<DeviceEntity> findByTenantIdAndCustomerId(@Param("tenantId") UUID tenantId,
|
||||||
@Param("customerId") UUID customerId,
|
@Param("customerId") UUID customerId,
|
||||||
@Param("searchText") String searchText,
|
@Param("textSearch") String textSearch,
|
||||||
Pageable pageable);
|
Pageable pageable);
|
||||||
|
|
||||||
@Query("SELECT d FROM DeviceEntity d WHERE d.tenantId = :tenantId " +
|
@Query("SELECT d FROM DeviceEntity d WHERE d.tenantId = :tenantId " +
|
||||||
"AND d.deviceProfileId = :profileId " +
|
"AND d.deviceProfileId = :profileId " +
|
||||||
"AND LOWER(d.searchText) LIKE LOWER(CONCAT('%', :searchText, '%'))")
|
"AND (LOWER(d.name) LIKE LOWER(CONCAT('%', :textSearch, '%')) " +
|
||||||
|
"OR LOWER(d.label) LIKE LOWER(CONCAT('%', :textSearch, '%')))")
|
||||||
Page<DeviceEntity> findByTenantIdAndProfileId(@Param("tenantId") UUID tenantId,
|
Page<DeviceEntity> findByTenantIdAndProfileId(@Param("tenantId") UUID tenantId,
|
||||||
@Param("profileId") UUID profileId,
|
@Param("profileId") UUID profileId,
|
||||||
@Param("searchText") String searchText,
|
@Param("textSearch") String textSearch,
|
||||||
Pageable pageable);
|
Pageable pageable);
|
||||||
|
|
||||||
@Query("SELECT d FROM DeviceInfoEntity d " +
|
@Query("SELECT d FROM DeviceInfoEntity d " +
|
||||||
"WHERE d.tenantId = :tenantId " +
|
"WHERE d.tenantId = :tenantId " +
|
||||||
"AND d.customerId = :customerId " +
|
"AND d.customerId = :customerId " +
|
||||||
"AND LOWER(d.searchText) LIKE LOWER(CONCAT('%', :searchText, '%'))")
|
"AND (LOWER(d.name) LIKE LOWER(CONCAT('%', :textSearch, '%')) " +
|
||||||
|
"OR LOWER(d.label) LIKE LOWER(CONCAT('%', :textSearch, '%')))")
|
||||||
Page<DeviceInfoEntity> findDeviceInfosByTenantIdAndCustomerId(@Param("tenantId") UUID tenantId,
|
Page<DeviceInfoEntity> findDeviceInfosByTenantIdAndCustomerId(@Param("tenantId") UUID tenantId,
|
||||||
@Param("customerId") UUID customerId,
|
@Param("customerId") UUID customerId,
|
||||||
@Param("searchText") String searchText,
|
@Param("textSearch") String textSearch,
|
||||||
Pageable pageable);
|
Pageable pageable);
|
||||||
|
|
||||||
@Query("SELECT d FROM DeviceEntity d WHERE d.tenantId = :tenantId")
|
@Query("SELECT d FROM DeviceEntity d WHERE d.tenantId = :tenantId")
|
||||||
@ -63,14 +66,16 @@ public interface DeviceRepository extends JpaRepository<DeviceEntity, UUID>, Exp
|
|||||||
Pageable pageable);
|
Pageable pageable);
|
||||||
|
|
||||||
@Query("SELECT d FROM DeviceEntity d WHERE d.tenantId = :tenantId " +
|
@Query("SELECT d FROM DeviceEntity d WHERE d.tenantId = :tenantId " +
|
||||||
"AND LOWER(d.searchText) LIKE LOWER(CONCAT('%', :textSearch, '%'))")
|
"AND (LOWER(d.name) LIKE LOWER(CONCAT('%', :textSearch, '%')) " +
|
||||||
|
"OR LOWER(d.label) LIKE LOWER(CONCAT('%', :textSearch, '%')))")
|
||||||
Page<DeviceEntity> findByTenantId(@Param("tenantId") UUID tenantId,
|
Page<DeviceEntity> findByTenantId(@Param("tenantId") UUID tenantId,
|
||||||
@Param("textSearch") String textSearch,
|
@Param("textSearch") String textSearch,
|
||||||
Pageable pageable);
|
Pageable pageable);
|
||||||
|
|
||||||
@Query("SELECT d FROM DeviceEntity d WHERE d.tenantId = :tenantId " +
|
@Query("SELECT d FROM DeviceEntity d WHERE d.tenantId = :tenantId " +
|
||||||
"AND d.type = :type " +
|
"AND d.type = :type " +
|
||||||
"AND LOWER(d.searchText) LIKE LOWER(CONCAT('%', :textSearch, '%'))")
|
"AND (LOWER(d.name) LIKE LOWER(CONCAT('%', :textSearch, '%')) " +
|
||||||
|
"OR LOWER(d.label) LIKE LOWER(CONCAT('%', :textSearch, '%')))")
|
||||||
Page<DeviceEntity> findByTenantIdAndType(@Param("tenantId") UUID tenantId,
|
Page<DeviceEntity> findByTenantIdAndType(@Param("tenantId") UUID tenantId,
|
||||||
@Param("type") String type,
|
@Param("type") String type,
|
||||||
@Param("textSearch") String textSearch,
|
@Param("textSearch") String textSearch,
|
||||||
@ -79,7 +84,8 @@ public interface DeviceRepository extends JpaRepository<DeviceEntity, UUID>, Exp
|
|||||||
@Query("SELECT d FROM DeviceEntity d WHERE d.tenantId = :tenantId " +
|
@Query("SELECT d FROM DeviceEntity d WHERE d.tenantId = :tenantId " +
|
||||||
"AND d.deviceProfileId = :deviceProfileId " +
|
"AND d.deviceProfileId = :deviceProfileId " +
|
||||||
"AND d.firmwareId = null " +
|
"AND d.firmwareId = null " +
|
||||||
"AND LOWER(d.searchText) LIKE LOWER(CONCAT('%', :textSearch, '%'))")
|
"AND (LOWER(d.name) LIKE LOWER(CONCAT('%', :textSearch, '%')) " +
|
||||||
|
"OR LOWER(d.label) LIKE LOWER(CONCAT('%', :textSearch, '%')))")
|
||||||
Page<DeviceEntity> findByTenantIdAndTypeAndFirmwareIdIsNull(@Param("tenantId") UUID tenantId,
|
Page<DeviceEntity> findByTenantIdAndTypeAndFirmwareIdIsNull(@Param("tenantId") UUID tenantId,
|
||||||
@Param("deviceProfileId") UUID deviceProfileId,
|
@Param("deviceProfileId") UUID deviceProfileId,
|
||||||
@Param("textSearch") String textSearch,
|
@Param("textSearch") String textSearch,
|
||||||
@ -88,7 +94,8 @@ public interface DeviceRepository extends JpaRepository<DeviceEntity, UUID>, Exp
|
|||||||
@Query("SELECT d FROM DeviceEntity d WHERE d.tenantId = :tenantId " +
|
@Query("SELECT d FROM DeviceEntity d WHERE d.tenantId = :tenantId " +
|
||||||
"AND d.deviceProfileId = :deviceProfileId " +
|
"AND d.deviceProfileId = :deviceProfileId " +
|
||||||
"AND d.softwareId = null " +
|
"AND d.softwareId = null " +
|
||||||
"AND LOWER(d.searchText) LIKE LOWER(CONCAT('%', :textSearch, '%'))")
|
"AND (LOWER(d.name) LIKE LOWER(CONCAT('%', :textSearch, '%')) " +
|
||||||
|
"OR LOWER(d.label) LIKE LOWER(CONCAT('%', :textSearch, '%')))")
|
||||||
Page<DeviceEntity> findByTenantIdAndTypeAndSoftwareIdIsNull(@Param("tenantId") UUID tenantId,
|
Page<DeviceEntity> findByTenantIdAndTypeAndSoftwareIdIsNull(@Param("tenantId") UUID tenantId,
|
||||||
@Param("deviceProfileId") UUID deviceProfileId,
|
@Param("deviceProfileId") UUID deviceProfileId,
|
||||||
@Param("textSearch") String textSearch,
|
@Param("textSearch") String textSearch,
|
||||||
@ -109,7 +116,8 @@ public interface DeviceRepository extends JpaRepository<DeviceEntity, UUID>, Exp
|
|||||||
@Query("SELECT d FROM DeviceEntity d WHERE d.tenantId = :tenantId " +
|
@Query("SELECT d FROM DeviceEntity d WHERE d.tenantId = :tenantId " +
|
||||||
"AND d.customerId = :customerId " +
|
"AND d.customerId = :customerId " +
|
||||||
"AND d.type = :type " +
|
"AND d.type = :type " +
|
||||||
"AND LOWER(d.searchText) LIKE LOWER(CONCAT('%', :textSearch, '%'))")
|
"AND (LOWER(d.name) LIKE LOWER(CONCAT('%', :textSearch, '%')) " +
|
||||||
|
"OR LOWER(d.label) LIKE LOWER(CONCAT('%', :textSearch, '%')))")
|
||||||
Page<DeviceEntity> findByTenantIdAndCustomerIdAndType(@Param("tenantId") UUID tenantId,
|
Page<DeviceEntity> findByTenantIdAndCustomerIdAndType(@Param("tenantId") UUID tenantId,
|
||||||
@Param("customerId") UUID customerId,
|
@Param("customerId") UUID customerId,
|
||||||
@Param("type") String type,
|
@Param("type") String type,
|
||||||
@ -123,7 +131,7 @@ public interface DeviceRepository extends JpaRepository<DeviceEntity, UUID>, Exp
|
|||||||
"AND ((:deviceType) IS NULL OR d.type = :deviceType) " +
|
"AND ((:deviceType) IS NULL OR d.type = :deviceType) " +
|
||||||
"AND (:deviceProfileId IS NULL OR d.deviceProfileId = uuid(:deviceProfileId)) " +
|
"AND (:deviceProfileId IS NULL OR d.deviceProfileId = uuid(:deviceProfileId)) " +
|
||||||
"AND ((:filterByActive) IS FALSE OR d.active = :deviceActive) " +
|
"AND ((:filterByActive) IS FALSE OR d.active = :deviceActive) " +
|
||||||
"AND (LOWER(d.searchText) LIKE LOWER(CONCAT('%', :textSearch, '%')) " +
|
"AND (LOWER(d.name) LIKE LOWER(CONCAT('%', :textSearch, '%')) " +
|
||||||
"OR LOWER(d.label) LIKE LOWER(CONCAT('%', :textSearch, '%')) " +
|
"OR LOWER(d.label) LIKE LOWER(CONCAT('%', :textSearch, '%')) " +
|
||||||
"OR LOWER(d.type) LIKE LOWER(CONCAT('%', :textSearch, '%')) " +
|
"OR LOWER(d.type) LIKE LOWER(CONCAT('%', :textSearch, '%')) " +
|
||||||
"OR LOWER(d.customerTitle) LIKE LOWER(CONCAT('%', :textSearch, '%')))")
|
"OR LOWER(d.customerTitle) LIKE LOWER(CONCAT('%', :textSearch, '%')))")
|
||||||
@ -155,21 +163,23 @@ public interface DeviceRepository extends JpaRepository<DeviceEntity, UUID>, Exp
|
|||||||
@Query("SELECT d FROM DeviceEntity d, RelationEntity re WHERE d.tenantId = :tenantId " +
|
@Query("SELECT d FROM DeviceEntity d, RelationEntity re WHERE d.tenantId = :tenantId " +
|
||||||
"AND d.id = re.toId AND re.toType = 'DEVICE' AND re.relationTypeGroup = 'EDGE' " +
|
"AND d.id = re.toId AND re.toType = 'DEVICE' AND re.relationTypeGroup = 'EDGE' " +
|
||||||
"AND re.relationType = 'Contains' AND re.fromId = :edgeId AND re.fromType = 'EDGE' " +
|
"AND re.relationType = 'Contains' AND re.fromId = :edgeId AND re.fromType = 'EDGE' " +
|
||||||
"AND LOWER(d.searchText) LIKE LOWER(CONCAT('%', :searchText, '%'))")
|
"AND (LOWER(d.name) LIKE LOWER(CONCAT('%', :textSearch, '%')) " +
|
||||||
|
"OR LOWER(d.label) LIKE LOWER(CONCAT('%', :textSearch, '%')))")
|
||||||
Page<DeviceEntity> findByTenantIdAndEdgeId(@Param("tenantId") UUID tenantId,
|
Page<DeviceEntity> findByTenantIdAndEdgeId(@Param("tenantId") UUID tenantId,
|
||||||
@Param("edgeId") UUID edgeId,
|
@Param("edgeId") UUID edgeId,
|
||||||
@Param("searchText") String searchText,
|
@Param("textSearch") String textSearch,
|
||||||
Pageable pageable);
|
Pageable pageable);
|
||||||
|
|
||||||
@Query("SELECT d FROM DeviceEntity d, RelationEntity re WHERE d.tenantId = :tenantId " +
|
@Query("SELECT d FROM DeviceEntity d, RelationEntity re WHERE d.tenantId = :tenantId " +
|
||||||
"AND d.id = re.toId AND re.toType = 'DEVICE' AND re.relationTypeGroup = 'EDGE' " +
|
"AND d.id = re.toId AND re.toType = 'DEVICE' AND re.relationTypeGroup = 'EDGE' " +
|
||||||
"AND re.relationType = 'Contains' AND re.fromId = :edgeId AND re.fromType = 'EDGE' " +
|
"AND re.relationType = 'Contains' AND re.fromId = :edgeId AND re.fromType = 'EDGE' " +
|
||||||
"AND d.type = :type " +
|
"AND d.type = :type " +
|
||||||
"AND LOWER(d.searchText) LIKE LOWER(CONCAT('%', :searchText, '%'))")
|
"AND (LOWER(d.name) LIKE LOWER(CONCAT('%', :textSearch, '%')) " +
|
||||||
|
"OR LOWER(d.label) LIKE LOWER(CONCAT('%', :textSearch, '%')))")
|
||||||
Page<DeviceEntity> findByTenantIdAndEdgeIdAndType(@Param("tenantId") UUID tenantId,
|
Page<DeviceEntity> findByTenantIdAndEdgeIdAndType(@Param("tenantId") UUID tenantId,
|
||||||
@Param("edgeId") UUID edgeId,
|
@Param("edgeId") UUID edgeId,
|
||||||
@Param("type") String type,
|
@Param("type") String type,
|
||||||
@Param("searchText") String searchText,
|
@Param("textSearch") String textSearch,
|
||||||
Pageable pageable);
|
Pageable pageable);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -40,7 +40,7 @@ import org.thingsboard.server.common.data.page.PageLink;
|
|||||||
import org.thingsboard.server.dao.DaoUtil;
|
import org.thingsboard.server.dao.DaoUtil;
|
||||||
import org.thingsboard.server.dao.device.DeviceDao;
|
import org.thingsboard.server.dao.device.DeviceDao;
|
||||||
import org.thingsboard.server.dao.model.sql.DeviceEntity;
|
import org.thingsboard.server.dao.model.sql.DeviceEntity;
|
||||||
import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao;
|
import org.thingsboard.server.dao.sql.JpaAbstractDao;
|
||||||
import org.thingsboard.server.dao.util.SqlDao;
|
import org.thingsboard.server.dao.util.SqlDao;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@ -56,7 +56,7 @@ import java.util.UUID;
|
|||||||
@Component
|
@Component
|
||||||
@SqlDao
|
@SqlDao
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class JpaDeviceDao extends JpaAbstractSearchTextDao<DeviceEntity, Device> implements DeviceDao {
|
public class JpaDeviceDao extends JpaAbstractDao<DeviceEntity, Device> implements DeviceDao {
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private DeviceRepository deviceRepository;
|
private DeviceRepository deviceRepository;
|
||||||
|
|||||||
@ -17,6 +17,7 @@ package org.thingsboard.server.dao.sql.query;
|
|||||||
|
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
|
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
|
||||||
import org.springframework.stereotype.Repository;
|
import org.springframework.stereotype.Repository;
|
||||||
@ -66,6 +67,7 @@ import java.util.stream.Collectors;
|
|||||||
@Slf4j
|
@Slf4j
|
||||||
public class DefaultEntityQueryRepository implements EntityQueryRepository {
|
public class DefaultEntityQueryRepository implements EntityQueryRepository {
|
||||||
private static final Map<EntityType, String> entityTableMap = new HashMap<>();
|
private static final Map<EntityType, String> entityTableMap = new HashMap<>();
|
||||||
|
private static final Map<EntityType, String> entityNameColumns = new HashMap<>();
|
||||||
private static final String SELECT_PHONE = " CASE WHEN entity.entity_type = 'TENANT' THEN (select phone from tenant where id = entity_id)" +
|
private static final String SELECT_PHONE = " CASE WHEN entity.entity_type = 'TENANT' THEN (select phone from tenant where id = entity_id)" +
|
||||||
" WHEN entity.entity_type = 'CUSTOMER' THEN (select phone from customer where id = entity_id) END as phone";
|
" WHEN entity.entity_type = 'CUSTOMER' THEN (select phone from customer where id = entity_id) END as phone";
|
||||||
private static final String SELECT_ZIP = " CASE WHEN entity.entity_type = 'TENANT' THEN (select zip from tenant where id = entity_id)" +
|
private static final String SELECT_ZIP = " CASE WHEN entity.entity_type = 'TENANT' THEN (select zip from tenant where id = entity_id)" +
|
||||||
@ -242,6 +244,24 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository {
|
|||||||
entityTableMap.put(EntityType.DEVICE_PROFILE, "device_profile");
|
entityTableMap.put(EntityType.DEVICE_PROFILE, "device_profile");
|
||||||
entityTableMap.put(EntityType.ASSET_PROFILE, "asset_profile");
|
entityTableMap.put(EntityType.ASSET_PROFILE, "asset_profile");
|
||||||
entityTableMap.put(EntityType.TENANT_PROFILE, "tenant_profile");
|
entityTableMap.put(EntityType.TENANT_PROFILE, "tenant_profile");
|
||||||
|
|
||||||
|
entityNameColumns.put(EntityType.DEVICE, "name");
|
||||||
|
entityNameColumns.put(EntityType.CUSTOMER, "title");
|
||||||
|
entityNameColumns.put(EntityType.DASHBOARD, "title");
|
||||||
|
entityNameColumns.put(EntityType.RULE_CHAIN, "name");
|
||||||
|
entityNameColumns.put(EntityType.RULE_NODE, "name");
|
||||||
|
entityNameColumns.put(EntityType.OTA_PACKAGE, "title");
|
||||||
|
entityNameColumns.put(EntityType.ASSET_PROFILE, "name");
|
||||||
|
entityNameColumns.put(EntityType.ASSET, "name");
|
||||||
|
entityNameColumns.put(EntityType.DEVICE_PROFILE, "name");
|
||||||
|
entityNameColumns.put(EntityType.USER, "email");
|
||||||
|
entityNameColumns.put(EntityType.TENANT_PROFILE, "name");
|
||||||
|
entityNameColumns.put(EntityType.TENANT, "title");
|
||||||
|
entityNameColumns.put(EntityType.WIDGETS_BUNDLE, "title");
|
||||||
|
entityNameColumns.put(EntityType.ENTITY_VIEW, "name");
|
||||||
|
entityNameColumns.put(EntityType.TB_RESOURCE, "search_text");
|
||||||
|
entityNameColumns.put(EntityType.EDGE, "name");
|
||||||
|
entityNameColumns.put(EntityType.QUEUE, "name");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static EntityType[] RELATION_QUERY_ENTITY_TYPES = new EntityType[]{
|
public static EntityType[] RELATION_QUERY_ENTITY_TYPES = new EntityType[]{
|
||||||
@ -807,33 +827,38 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository {
|
|||||||
|
|
||||||
private String entityNameQuery(QueryContext ctx, EntityNameFilter filter) {
|
private String entityNameQuery(QueryContext ctx, EntityNameFilter filter) {
|
||||||
ctx.addStringParameter("entity_filter_name_filter", filter.getEntityNameFilter());
|
ctx.addStringParameter("entity_filter_name_filter", filter.getEntityNameFilter());
|
||||||
|
String nameColumn = getNameColumn(filter.getEntityType());
|
||||||
if (filter.getEntityNameFilter().startsWith("%") || filter.getEntityNameFilter().endsWith("%")) {
|
if (filter.getEntityNameFilter().startsWith("%") || filter.getEntityNameFilter().endsWith("%")) {
|
||||||
return "lower(e.search_text) like lower(:entity_filter_name_filter)";
|
return String.format("lower(e.%s) like lower(:entity_filter_name_filter)", nameColumn);
|
||||||
}
|
}
|
||||||
|
|
||||||
return "lower(e.search_text) like lower(concat(:entity_filter_name_filter, '%%'))";
|
return String.format("lower(e.%s) like lower(concat(:entity_filter_name_filter, '%%'))", nameColumn);
|
||||||
}
|
}
|
||||||
|
|
||||||
private String typeQuery(QueryContext ctx, EntityFilter filter) {
|
private String typeQuery(QueryContext ctx, EntityFilter filter) {
|
||||||
List<String> types;
|
List<String> types;
|
||||||
String name;
|
String name;
|
||||||
|
String nameColumn;
|
||||||
switch (filter.getType()) {
|
switch (filter.getType()) {
|
||||||
case ASSET_TYPE:
|
case ASSET_TYPE:
|
||||||
types = ((AssetTypeFilter) filter).getAssetTypes();
|
types = ((AssetTypeFilter) filter).getAssetTypes();
|
||||||
name = ((AssetTypeFilter) filter).getAssetNameFilter();
|
name = ((AssetTypeFilter) filter).getAssetNameFilter();
|
||||||
|
nameColumn = getNameColumn(EntityType.ASSET);
|
||||||
break;
|
break;
|
||||||
case DEVICE_TYPE:
|
case DEVICE_TYPE:
|
||||||
types = ((DeviceTypeFilter) filter).getDeviceTypes();
|
types = ((DeviceTypeFilter) filter).getDeviceTypes();
|
||||||
name = ((DeviceTypeFilter) filter).getDeviceNameFilter();
|
name = ((DeviceTypeFilter) filter).getDeviceNameFilter();
|
||||||
|
nameColumn = getNameColumn(EntityType.DEVICE);
|
||||||
break;
|
break;
|
||||||
case ENTITY_VIEW_TYPE:
|
case ENTITY_VIEW_TYPE:
|
||||||
types = ((EntityViewTypeFilter) filter).getEntityViewTypes();
|
types = ((EntityViewTypeFilter) filter).getEntityViewTypes();
|
||||||
name = ((EntityViewTypeFilter) filter).getEntityViewNameFilter();
|
name = ((EntityViewTypeFilter) filter).getEntityViewNameFilter();
|
||||||
|
nameColumn = getNameColumn(EntityType.ENTITY_VIEW);
|
||||||
break;
|
break;
|
||||||
case EDGE_TYPE:
|
case EDGE_TYPE:
|
||||||
types = ((EdgeTypeFilter) filter).getEdgeTypes();
|
types = ((EdgeTypeFilter) filter).getEdgeTypes();
|
||||||
name = ((EdgeTypeFilter) filter).getEdgeNameFilter();
|
name = ((EdgeTypeFilter) filter).getEdgeNameFilter();
|
||||||
|
nameColumn = getNameColumn(EntityType.EDGE);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
throw new RuntimeException("Not supported!");
|
throw new RuntimeException("Not supported!");
|
||||||
@ -843,14 +868,23 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository {
|
|||||||
if (!StringUtils.isEmpty(name)) {
|
if (!StringUtils.isEmpty(name)) {
|
||||||
ctx.addStringParameter("entity_filter_type_query_name", name);
|
ctx.addStringParameter("entity_filter_type_query_name", name);
|
||||||
if (name.startsWith("%") || name.endsWith("%")) {
|
if (name.startsWith("%") || name.endsWith("%")) {
|
||||||
return typesFilter + " and lower(e.search_text) like lower(:entity_filter_type_query_name)";
|
return typesFilter + " and lower(e." + nameColumn + ") like lower(:entity_filter_type_query_name)";
|
||||||
}
|
}
|
||||||
return typesFilter + " and lower(e.search_text) like lower(concat(:entity_filter_type_query_name, '%%'))";
|
return typesFilter + " and lower(e." + nameColumn + ") like lower(concat(:entity_filter_type_query_name, '%%'))";
|
||||||
} else {
|
} else {
|
||||||
return typesFilter;
|
return typesFilter;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String getNameColumn(EntityType entityType) {
|
||||||
|
String nameColumn = entityNameColumns.get(entityType);
|
||||||
|
if (nameColumn == null) {
|
||||||
|
log.error("Name column is not defined in the entityNameColumns map for entity type {}.", entityType);
|
||||||
|
throw new RuntimeException("Name column is not defined for entity type: " + entityType);
|
||||||
|
}
|
||||||
|
return nameColumn;
|
||||||
|
}
|
||||||
|
|
||||||
public static EntityType resolveEntityType(EntityFilter entityFilter) {
|
public static EntityType resolveEntityType(EntityFilter entityFilter) {
|
||||||
switch (entityFilter.getType()) {
|
switch (entityFilter.getType()) {
|
||||||
case SINGLE_ENTITY:
|
case SINGLE_ENTITY:
|
||||||
|
|||||||
@ -340,7 +340,6 @@ CREATE TABLE IF NOT EXISTS device (
|
|||||||
type varchar(255),
|
type varchar(255),
|
||||||
name varchar(255),
|
name varchar(255),
|
||||||
label varchar(255),
|
label varchar(255),
|
||||||
search_text varchar(255),
|
|
||||||
tenant_id uuid,
|
tenant_id uuid,
|
||||||
firmware_id uuid,
|
firmware_id uuid,
|
||||||
software_id uuid,
|
software_id uuid,
|
||||||
|
|||||||
@ -16,6 +16,7 @@
|
|||||||
package org.thingsboard.rule.engine.util;
|
package org.thingsboard.rule.engine.util;
|
||||||
|
|
||||||
import org.thingsboard.rule.engine.api.TbContext;
|
import org.thingsboard.rule.engine.api.TbContext;
|
||||||
|
import org.thingsboard.server.common.data.BaseData;
|
||||||
import org.thingsboard.server.common.data.EntityType;
|
import org.thingsboard.server.common.data.EntityType;
|
||||||
import org.thingsboard.server.common.data.SearchTextBasedWithAdditionalInfo;
|
import org.thingsboard.server.common.data.SearchTextBasedWithAdditionalInfo;
|
||||||
import org.thingsboard.server.common.data.id.EntityId;
|
import org.thingsboard.server.common.data.id.EntityId;
|
||||||
@ -32,7 +33,7 @@ public class EntitiesByNameAndTypeLoader {
|
|||||||
EntityType.USER);
|
EntityType.USER);
|
||||||
|
|
||||||
public static EntityId findEntityId(TbContext ctx, EntityType entityType, String entityName) {
|
public static EntityId findEntityId(TbContext ctx, EntityType entityType, String entityName) {
|
||||||
SearchTextBasedWithAdditionalInfo<? extends EntityId> targetEntity;
|
BaseData<? extends EntityId> targetEntity;
|
||||||
switch (entityType) {
|
switch (entityType) {
|
||||||
case DEVICE:
|
case DEVICE:
|
||||||
targetEntity = ctx.getDeviceService().findDeviceByTenantIdAndName(ctx.getTenantId(), entityName);
|
targetEntity = ctx.getDeviceService().findDeviceByTenantIdAndName(ctx.getTenantId(), entityName);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user