|
|
|
@ -15,10 +15,14 @@ |
|
|
|
*/ |
|
|
|
package org.thingsboard.server.dao.service; |
|
|
|
|
|
|
|
import com.google.common.util.concurrent.Futures; |
|
|
|
import com.google.common.util.concurrent.ListenableFuture; |
|
|
|
import org.junit.After; |
|
|
|
import org.junit.Assert; |
|
|
|
import org.junit.Before; |
|
|
|
import org.junit.Test; |
|
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
|
import org.thingsboard.server.common.data.DataConstants; |
|
|
|
import org.thingsboard.server.common.data.Device; |
|
|
|
import org.thingsboard.server.common.data.EntityType; |
|
|
|
import org.thingsboard.server.common.data.Tenant; |
|
|
|
@ -26,6 +30,10 @@ import org.thingsboard.server.common.data.id.CustomerId; |
|
|
|
import org.thingsboard.server.common.data.id.DeviceId; |
|
|
|
import org.thingsboard.server.common.data.id.EntityId; |
|
|
|
import org.thingsboard.server.common.data.id.TenantId; |
|
|
|
import org.thingsboard.server.common.data.kv.AttributeKvEntry; |
|
|
|
import org.thingsboard.server.common.data.kv.BaseAttributeKvEntry; |
|
|
|
import org.thingsboard.server.common.data.kv.KvEntry; |
|
|
|
import org.thingsboard.server.common.data.kv.LongDataEntry; |
|
|
|
import org.thingsboard.server.common.data.page.PageData; |
|
|
|
import org.thingsboard.server.common.data.query.DeviceTypeFilter; |
|
|
|
import org.thingsboard.server.common.data.query.EntityCountQuery; |
|
|
|
@ -37,14 +45,21 @@ import org.thingsboard.server.common.data.query.EntityFilter; |
|
|
|
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.KeyFilter; |
|
|
|
import org.thingsboard.server.common.data.query.NumericFilterPredicate; |
|
|
|
import org.thingsboard.server.dao.attributes.AttributesService; |
|
|
|
|
|
|
|
import java.util.ArrayList; |
|
|
|
import java.util.Collections; |
|
|
|
import java.util.List; |
|
|
|
import java.util.concurrent.ExecutionException; |
|
|
|
import java.util.stream.Collectors; |
|
|
|
|
|
|
|
public abstract class BaseEntityServiceTest extends AbstractServiceTest { |
|
|
|
|
|
|
|
@Autowired |
|
|
|
private AttributesService attributesService; |
|
|
|
|
|
|
|
private TenantId tenantId; |
|
|
|
|
|
|
|
@Before |
|
|
|
@ -105,7 +120,7 @@ public abstract class BaseEntityServiceTest extends AbstractServiceTest { |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testFindEntityDataByQuery() { |
|
|
|
public void testSimpleFindEntityDataByQuery() { |
|
|
|
List<Device> devices = new ArrayList<>(); |
|
|
|
for (int i = 0; i < 97; i++) { |
|
|
|
Device device = new Device(); |
|
|
|
@ -135,7 +150,7 @@ public abstract class BaseEntityServiceTest extends AbstractServiceTest { |
|
|
|
Assert.assertEquals(10, data.getData().size()); |
|
|
|
|
|
|
|
List<EntityData> loadedEntities = new ArrayList<>(data.getData()); |
|
|
|
while(data.hasNext()) { |
|
|
|
while (data.hasNext()) { |
|
|
|
query = query.next(); |
|
|
|
data = entityService.findEntityDataByQuery(tenantId, new CustomerId(CustomerId.NULL_UUID), query); |
|
|
|
loadedEntities.addAll(data.getData()); |
|
|
|
@ -162,5 +177,96 @@ public abstract class BaseEntityServiceTest extends AbstractServiceTest { |
|
|
|
data = entityService.findEntityDataByQuery(tenantId, new CustomerId(CustomerId.NULL_UUID), query); |
|
|
|
Assert.assertEquals(11, data.getTotalElements()); |
|
|
|
Assert.assertEquals("Device19", data.getData().get(0).getLatest().get(EntityKeyType.ENTITY_FIELD).get("name").getValue()); |
|
|
|
|
|
|
|
deviceService.deleteDevicesByTenantId(tenantId); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testFindEntityDataByQueryWithAttributes() throws ExecutionException, InterruptedException { |
|
|
|
|
|
|
|
List<Device> devices = new ArrayList<>(); |
|
|
|
List<Long> temperatures = new ArrayList<>(); |
|
|
|
List<Long> highTemperatures = new ArrayList<>(); |
|
|
|
for (int i=0;i<67;i++) { |
|
|
|
Device device = new Device(); |
|
|
|
device.setTenantId(tenantId); |
|
|
|
device.setName("Device"+i); |
|
|
|
device.setType("default"); |
|
|
|
device.setLabel("testLabel"+(int)(Math.random()*1000)); |
|
|
|
devices.add(deviceService.saveDevice(device)); |
|
|
|
long temperature = (long)(Math.random()*100); |
|
|
|
temperatures.add(temperature); |
|
|
|
if (temperature > 45) { |
|
|
|
highTemperatures.add(temperature); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
List<ListenableFuture<List<Void>>> attributeFutures = new ArrayList<>(); |
|
|
|
for (int i=0;i<devices.size();i++) { |
|
|
|
Device device = devices.get(i); |
|
|
|
attributeFutures.add(saveLongAttribute(device.getId(), "temperature", temperatures.get(i), DataConstants.CLIENT_SCOPE)); |
|
|
|
} |
|
|
|
Futures.successfulAsList(attributeFutures).get(); |
|
|
|
|
|
|
|
DeviceTypeFilter filter = new DeviceTypeFilter(); |
|
|
|
filter.setDeviceType("default"); |
|
|
|
filter.setDeviceNameFilter(""); |
|
|
|
|
|
|
|
EntityDataSortOrder sortOrder = new EntityDataSortOrder( |
|
|
|
new EntityKey(EntityKeyType.ENTITY_FIELD, "createdTime"), EntityDataSortOrder.Direction.ASC |
|
|
|
); |
|
|
|
EntityDataPageLink pageLink = new EntityDataPageLink(10, 0, null, sortOrder); |
|
|
|
List<EntityKey> entityFields = Collections.singletonList(new EntityKey(EntityKeyType.ENTITY_FIELD, "name")); |
|
|
|
List<EntityKey> latestValues = Collections.singletonList(new EntityKey(EntityKeyType.ATTRIBUTE, "temperature")); |
|
|
|
|
|
|
|
EntityDataQuery query = new EntityDataQuery(filter, pageLink, entityFields, latestValues, null); |
|
|
|
PageData<EntityData> data = entityService.findEntityDataByQuery(tenantId, new CustomerId(CustomerId.NULL_UUID), query); |
|
|
|
|
|
|
|
List<EntityData> loadedEntities = new ArrayList<>(data.getData()); |
|
|
|
while (data.hasNext()) { |
|
|
|
query = query.next(); |
|
|
|
data = entityService.findEntityDataByQuery(tenantId, new CustomerId(CustomerId.NULL_UUID), query); |
|
|
|
loadedEntities.addAll(data.getData()); |
|
|
|
} |
|
|
|
Assert.assertEquals(67, loadedEntities.size()); |
|
|
|
List<String> loadedTemperatures = loadedEntities.stream().map(entityData -> |
|
|
|
entityData.getLatest().get(EntityKeyType.ATTRIBUTE).get("temperature").getValue()).collect(Collectors.toList()); |
|
|
|
List<String> deviceTemperatures = temperatures.stream().map(aLong -> Long.toString(aLong)).collect(Collectors.toList()); |
|
|
|
Assert.assertEquals(deviceTemperatures, loadedTemperatures); |
|
|
|
|
|
|
|
pageLink = new EntityDataPageLink(10, 0, null, sortOrder); |
|
|
|
KeyFilter highTemperatureFilter = new KeyFilter(); |
|
|
|
highTemperatureFilter.setKey(new EntityKey(EntityKeyType.ATTRIBUTE, "temperature")); |
|
|
|
NumericFilterPredicate predicate = new NumericFilterPredicate(); |
|
|
|
predicate.setValue(45); |
|
|
|
predicate.setOperation(NumericFilterPredicate.NumericOperation.GREATER); |
|
|
|
highTemperatureFilter.setPredicate(predicate); |
|
|
|
List<KeyFilter> keyFilters = Collections.singletonList(highTemperatureFilter); |
|
|
|
|
|
|
|
query = new EntityDataQuery(filter, pageLink, entityFields, latestValues, keyFilters); |
|
|
|
|
|
|
|
data = entityService.findEntityDataByQuery(tenantId, new CustomerId(CustomerId.NULL_UUID), query); |
|
|
|
|
|
|
|
loadedEntities = new ArrayList<>(data.getData()); |
|
|
|
while (data.hasNext()) { |
|
|
|
query = query.next(); |
|
|
|
data = entityService.findEntityDataByQuery(tenantId, new CustomerId(CustomerId.NULL_UUID), query); |
|
|
|
loadedEntities.addAll(data.getData()); |
|
|
|
} |
|
|
|
Assert.assertEquals(highTemperatures.size(), loadedEntities.size()); |
|
|
|
|
|
|
|
List<String> loadedHighTemperatures = loadedEntities.stream().map(entityData -> |
|
|
|
entityData.getLatest().get(EntityKeyType.ATTRIBUTE).get("temperature").getValue()).collect(Collectors.toList()); |
|
|
|
List<String> deviceHighTemperatures = highTemperatures.stream().map(aLong -> Long.toString(aLong)).collect(Collectors.toList()); |
|
|
|
|
|
|
|
Assert.assertEquals(deviceHighTemperatures, loadedHighTemperatures); |
|
|
|
|
|
|
|
deviceService.deleteDevicesByTenantId(tenantId); |
|
|
|
} |
|
|
|
|
|
|
|
private ListenableFuture<List<Void>> saveLongAttribute(EntityId entityId, String key, long value, String scope) { |
|
|
|
KvEntry attrValue = new LongDataEntry(key, value); |
|
|
|
AttributeKvEntry attr = new BaseAttributeKvEntry(attrValue, 42L); |
|
|
|
return attributesService.save(SYSTEM_TENANT_ID, entityId, scope, Collections.singletonList(attr)); |
|
|
|
} |
|
|
|
} |
|
|
|
|