fixed filtering by entity name

This commit is contained in:
YevhenBondarenko 2023-02-27 14:21:39 +01:00
parent 84dbcb52af
commit 028b1a023d
2 changed files with 366 additions and 4 deletions

View File

@ -805,6 +805,11 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository {
private String entityNameQuery(QueryContext ctx, EntityNameFilter filter) {
ctx.addStringParameter("entity_filter_name_filter", filter.getEntityNameFilter());
if (filter.getEntityNameFilter().startsWith("%") || filter.getEntityNameFilter().endsWith("%")) {
return "lower(e.search_text) like lower(:entity_filter_name_filter)";
}
return "lower(e.search_text) like lower(concat(:entity_filter_name_filter, '%%'))";
}
@ -833,6 +838,11 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository {
}
ctx.addStringParameter("entity_filter_type_query_type", type);
ctx.addStringParameter("entity_filter_type_query_name", name);
if (name.startsWith("%") || name.endsWith("%")) {
return "e.type = :entity_filter_type_query_type and lower(e.search_text) like lower(:entity_filter_type_query_name)";
}
return "e.type = :entity_filter_type_query_type and lower(e.search_text) like lower(concat(:entity_filter_type_query_name, '%%'))";
}

View File

@ -26,7 +26,6 @@ import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.ResultSetExtractor;
import org.thingsboard.server.common.data.DataConstants;
import org.thingsboard.server.common.data.Device;
@ -50,6 +49,7 @@ import org.thingsboard.server.common.data.kv.LongDataEntry;
import org.thingsboard.server.common.data.kv.StringDataEntry;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.query.AssetSearchQueryFilter;
import org.thingsboard.server.common.data.query.AssetTypeFilter;
import org.thingsboard.server.common.data.query.DeviceSearchQueryFilter;
import org.thingsboard.server.common.data.query.DeviceTypeFilter;
import org.thingsboard.server.common.data.query.EdgeSearchQueryFilter;
@ -62,6 +62,7 @@ import org.thingsboard.server.common.data.query.EntityDataSortOrder;
import org.thingsboard.server.common.data.query.EntityKey;
import org.thingsboard.server.common.data.query.EntityKeyType;
import org.thingsboard.server.common.data.query.EntityListFilter;
import org.thingsboard.server.common.data.query.EntityNameFilter;
import org.thingsboard.server.common.data.query.FilterPredicateValue;
import org.thingsboard.server.common.data.query.KeyFilter;
import org.thingsboard.server.common.data.query.NumericFilterPredicate;
@ -106,9 +107,6 @@ public abstract class BaseEntityServiceTest extends AbstractServiceTest {
private TenantId tenantId;
@Autowired
private JdbcTemplate template;
@Autowired
private RelationRepository relationRepository;
@ -986,6 +984,360 @@ public abstract class BaseEntityServiceTest extends AbstractServiceTest {
assertEquals(devices.size(), result.getTotalElements());
}
@Test
public void testFindEntityDataByQuery_filter_entity_name_starts_with() {
List<Device> devices = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Device device = new Device();
device.setTenantId(tenantId);
device.setName("Device " + i + " test");
device.setType("default");
devices.add(device);
}
devices.forEach(deviceService::saveDevice);
EntityNameFilter deviceTypeFilter = new EntityNameFilter();
deviceTypeFilter.setEntityType(EntityType.DEVICE);
deviceTypeFilter.setEntityNameFilter("Device");
EntityDataPageLink pageLink = new EntityDataPageLink(1000, 0, null, null);
EntityDataQuery query = new EntityDataQuery(deviceTypeFilter, pageLink, null, null, null);
PageData<EntityData> result = searchEntities(query);
assertEquals(devices.size(), result.getTotalElements());
deviceTypeFilter.setEntityNameFilter("Device%");
result = searchEntities(query);
assertEquals(devices.size(), result.getTotalElements());
deviceTypeFilter.setEntityNameFilter("%Device%");
result = searchEntities(query);
assertEquals(devices.size(), result.getTotalElements());
deviceTypeFilter.setEntityNameFilter("%Device");
result = searchEntities(query);
assertEquals(0, result.getTotalElements());
}
@Test
public void testFindEntityDataByQuery_filter_entity_name_ends_with() {
List<Device> devices = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Device device = new Device();
device.setTenantId(tenantId);
device.setName("Device " + i + " test");
device.setType("default");
devices.add(device);
}
devices.forEach(deviceService::saveDevice);
EntityNameFilter deviceTypeFilter = new EntityNameFilter();
deviceTypeFilter.setEntityType(EntityType.DEVICE);
deviceTypeFilter.setEntityNameFilter("%test");
EntityDataPageLink pageLink = new EntityDataPageLink(1000, 0, null, null);
EntityDataQuery query = new EntityDataQuery(deviceTypeFilter, pageLink, null, null, null);
PageData<EntityData> result = searchEntities(query);
assertEquals(devices.size(), result.getTotalElements());
deviceTypeFilter.setEntityNameFilter("%test%");
result = searchEntities(query);
assertEquals(devices.size(), result.getTotalElements());
deviceTypeFilter.setEntityNameFilter("test%");
result = searchEntities(query);
assertEquals(0, result.getTotalElements());
deviceTypeFilter.setEntityNameFilter("test");
result = searchEntities(query);
assertEquals(0, result.getTotalElements());
}
@Test
public void testFindEntityDataByQuery_filter_entity_name_contains() {
List<Device> devices = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Device device = new Device();
device.setTenantId(tenantId);
device.setName("Device test" + i);
device.setType("default");
devices.add(device);
}
devices.forEach(deviceService::saveDevice);
EntityNameFilter deviceTypeFilter = new EntityNameFilter();
deviceTypeFilter.setEntityType(EntityType.DEVICE);
deviceTypeFilter.setEntityNameFilter("%test%");
EntityDataPageLink pageLink = new EntityDataPageLink(1000, 0, null, null);
EntityDataQuery query = new EntityDataQuery(deviceTypeFilter, pageLink, null, null, null);
PageData<EntityData> result = searchEntities(query);
assertEquals(devices.size(), result.getTotalElements());
deviceTypeFilter.setEntityNameFilter("test%");
result = searchEntities(query);
assertEquals(0, result.getTotalElements());
deviceTypeFilter.setEntityNameFilter("%test");
result = searchEntities(query);
assertEquals(0, result.getTotalElements());
}
@Test
public void testFindEntityDataByQuery_filter_device_type_name_starts_with() {
List<Device> devices = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Device device = new Device();
device.setTenantId(tenantId);
device.setName("Device " + i + " test");
device.setType("default");
devices.add(device);
}
devices.forEach(deviceService::saveDevice);
DeviceTypeFilter deviceTypeFilter = new DeviceTypeFilter();
deviceTypeFilter.setDeviceType("default");
deviceTypeFilter.setDeviceNameFilter("Device");
EntityDataPageLink pageLink = new EntityDataPageLink(1000, 0, null, null);
EntityDataQuery query = new EntityDataQuery(deviceTypeFilter, pageLink, null, null, null);
PageData<EntityData> result = searchEntities(query);
assertEquals(devices.size(), result.getTotalElements());
deviceTypeFilter.setDeviceNameFilter("Device%");
result = searchEntities(query);
assertEquals(devices.size(), result.getTotalElements());
deviceTypeFilter.setDeviceNameFilter("%Device%");
result = searchEntities(query);
assertEquals(devices.size(), result.getTotalElements());
deviceTypeFilter.setDeviceNameFilter("%Device");
result = searchEntities(query);
assertEquals(0, result.getTotalElements());
}
@Test
public void testFindEntityDataByQuery_filter_device_type_name_ends_with() {
List<Device> devices = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Device device = new Device();
device.setTenantId(tenantId);
device.setName("Device " + i + " test");
device.setType("default");
devices.add(device);
}
devices.forEach(deviceService::saveDevice);
DeviceTypeFilter deviceTypeFilter = new DeviceTypeFilter();
deviceTypeFilter.setDeviceType("default");
deviceTypeFilter.setDeviceNameFilter("%test");
EntityDataPageLink pageLink = new EntityDataPageLink(1000, 0, null, null);
EntityDataQuery query = new EntityDataQuery(deviceTypeFilter, pageLink, null, null, null);
PageData<EntityData> result = searchEntities(query);
assertEquals(devices.size(), result.getTotalElements());
deviceTypeFilter.setDeviceNameFilter("%test%");
result = searchEntities(query);
assertEquals(devices.size(), result.getTotalElements());
deviceTypeFilter.setDeviceNameFilter("test%");
result = searchEntities(query);
assertEquals(0, result.getTotalElements());
deviceTypeFilter.setDeviceNameFilter("test");
result = searchEntities(query);
assertEquals(0, result.getTotalElements());
}
@Test
public void testFindEntityDataByQuery_filter_device_type_name_contains() {
List<Device> devices = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Device device = new Device();
device.setTenantId(tenantId);
device.setName("Device test" + i);
device.setType("default");
devices.add(device);
}
devices.forEach(deviceService::saveDevice);
DeviceTypeFilter deviceTypeFilter = new DeviceTypeFilter();
deviceTypeFilter.setDeviceType("default");
deviceTypeFilter.setDeviceNameFilter("%test%");
EntityDataPageLink pageLink = new EntityDataPageLink(1000, 0, null, null);
EntityDataQuery query = new EntityDataQuery(deviceTypeFilter, pageLink, null, null, null);
PageData<EntityData> result = searchEntities(query);
assertEquals(devices.size(), result.getTotalElements());
deviceTypeFilter.setDeviceNameFilter("test%");
result = searchEntities(query);
assertEquals(0, result.getTotalElements());
deviceTypeFilter.setDeviceNameFilter("%test");
result = searchEntities(query);
assertEquals(0, result.getTotalElements());
}
@Test
public void testFindEntityDataByQuery_filter_asset_type_name_starts_with() {
List<Asset> assets = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Asset asset = new Asset();
asset.setTenantId(tenantId);
asset.setName("Asset " + i + " test");
asset.setType("default");
assets.add(asset);
}
assets.forEach(assetService::saveAsset);
AssetTypeFilter assetTypeFilter = new AssetTypeFilter();
assetTypeFilter.setAssetType("default");
assetTypeFilter.setAssetNameFilter("Asset");
EntityDataPageLink pageLink = new EntityDataPageLink(1000, 0, null, null);
EntityDataQuery query = new EntityDataQuery(assetTypeFilter, pageLink, null, null, null);
PageData<EntityData> result = searchEntities(query);
assertEquals(assets.size(), result.getTotalElements());
assetTypeFilter.setAssetNameFilter("Asset%");
result = searchEntities(query);
assertEquals(assets.size(), result.getTotalElements());
assetTypeFilter.setAssetNameFilter("%Asset%");
result = searchEntities(query);
assertEquals(assets.size(), result.getTotalElements());
assetTypeFilter.setAssetNameFilter("%Asset");
result = searchEntities(query);
assertEquals(0, result.getTotalElements());
}
@Test
public void testFindEntityDataByQuery_filter_asset_type_name_ends_with() {
List<Asset> assets = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Asset asset = new Asset();
asset.setTenantId(tenantId);
asset.setName("Asset " + i + " test");
asset.setType("default");
assets.add(asset);
}
assets.forEach(assetService::saveAsset);
AssetTypeFilter assetTypeFilter = new AssetTypeFilter();
assetTypeFilter.setAssetType("default");
assetTypeFilter.setAssetNameFilter("%test");
EntityDataPageLink pageLink = new EntityDataPageLink(1000, 0, null, null);
EntityDataQuery query = new EntityDataQuery(assetTypeFilter, pageLink, null, null, null);
PageData<EntityData> result = searchEntities(query);
assertEquals(assets.size(), result.getTotalElements());
assetTypeFilter.setAssetNameFilter("%test%");
result = searchEntities(query);
assertEquals(assets.size(), result.getTotalElements());
assetTypeFilter.setAssetNameFilter("test%");
result = searchEntities(query);
assertEquals(0, result.getTotalElements());
assetTypeFilter.setAssetNameFilter("test");
result = searchEntities(query);
assertEquals(0, result.getTotalElements());
}
@Test
public void testFindEntityDataByQuery_filter_asset_type_name_contains() {
List<Asset> assets = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Asset asset = new Asset();
asset.setTenantId(tenantId);
asset.setName("Asset test" + i);
asset.setType("default");
assets.add(asset);
}
assets.forEach(assetService::saveAsset);
AssetTypeFilter assetTypeFilter = new AssetTypeFilter();
assetTypeFilter.setAssetType("default");
assetTypeFilter.setAssetNameFilter("%test%");
EntityDataPageLink pageLink = new EntityDataPageLink(1000, 0, null, null);
EntityDataQuery query = new EntityDataQuery(assetTypeFilter, pageLink, null, null, null);
PageData<EntityData> result = searchEntities(query);
assertEquals(assets.size(), result.getTotalElements());
assetTypeFilter.setAssetNameFilter("test%");
result = searchEntities(query);
assertEquals(0, result.getTotalElements());
assetTypeFilter.setAssetNameFilter("%test");
result = searchEntities(query);
assertEquals(0, result.getTotalElements());
}
private PageData<EntityData> searchEntities(EntityDataQuery query) {
return entityService.findEntityDataByQuery(tenantId, new CustomerId(CustomerId.NULL_UUID), query);
}