Commit 1e0b9fee4dc80c422346dc4fd3268c26d7584a00

Authored by deaflynx
2 parents b8b55a98 63508698

Merge remote-tracking branch 'origin/feature/edge' into feature/edge

@@ -61,7 +61,7 @@ public class EdgeEventController extends BaseController { @@ -61,7 +61,7 @@ public class EdgeEventController extends BaseController {
61 EdgeId edgeId = new EdgeId(toUUID(strEdgeId)); 61 EdgeId edgeId = new EdgeId(toUUID(strEdgeId));
62 checkEdgeId(edgeId, Operation.READ); 62 checkEdgeId(edgeId, Operation.READ);
63 TimePageLink pageLink = createPageLink(limit, startTime, endTime, ascOrder, offset); 63 TimePageLink pageLink = createPageLink(limit, startTime, endTime, ascOrder, offset);
64 - return checkNotNull(edgeEventService.findEdgeEvents(tenantId, edgeId, pageLink)); 64 + return checkNotNull(edgeEventService.findEdgeEvents(tenantId, edgeId, pageLink, false));
65 } catch (Exception e) { 65 } catch (Exception e) {
66 throw handleException(e); 66 throw handleException(e);
67 } 67 }
@@ -111,7 +111,7 @@ public class DefaultEdgeNotificationService implements EdgeNotificationService { @@ -111,7 +111,7 @@ public class DefaultEdgeNotificationService implements EdgeNotificationService {
111 111
112 @Override 112 @Override
113 public TimePageData<EdgeEvent> findEdgeEvents(TenantId tenantId, EdgeId edgeId, TimePageLink pageLink) { 113 public TimePageData<EdgeEvent> findEdgeEvents(TenantId tenantId, EdgeId edgeId, TimePageLink pageLink) {
114 - return edgeEventService.findEdgeEvents(tenantId, edgeId, pageLink); 114 + return edgeEventService.findEdgeEvents(tenantId, edgeId, pageLink, true);
115 } 115 }
116 116
117 @Override 117 @Override
@@ -16,9 +16,7 @@ @@ -16,9 +16,7 @@
16 package org.thingsboard.server.dao.edge; 16 package org.thingsboard.server.dao.edge;
17 17
18 import com.google.common.util.concurrent.ListenableFuture; 18 import com.google.common.util.concurrent.ListenableFuture;
19 -import org.thingsboard.server.common.data.EntityType;  
20 import org.thingsboard.server.common.data.edge.EdgeEvent; 19 import org.thingsboard.server.common.data.edge.EdgeEvent;
21 -import org.thingsboard.server.common.data.edge.EdgeEventType;  
22 import org.thingsboard.server.common.data.id.EdgeId; 20 import org.thingsboard.server.common.data.id.EdgeId;
23 import org.thingsboard.server.common.data.id.TenantId; 21 import org.thingsboard.server.common.data.id.TenantId;
24 import org.thingsboard.server.common.data.page.TimePageData; 22 import org.thingsboard.server.common.data.page.TimePageData;
@@ -28,6 +26,5 @@ public interface EdgeEventService { @@ -28,6 +26,5 @@ public interface EdgeEventService {
28 26
29 ListenableFuture<EdgeEvent> saveAsync(EdgeEvent edgeEvent); 27 ListenableFuture<EdgeEvent> saveAsync(EdgeEvent edgeEvent);
30 28
31 - TimePageData<EdgeEvent> findEdgeEvents(TenantId tenantId, EdgeId edgeId, TimePageLink pageLink);  
32 - 29 + TimePageData<EdgeEvent> findEdgeEvents(TenantId tenantId, EdgeId edgeId, TimePageLink pageLink, boolean withTsUpdate);
33 } 30 }
@@ -155,6 +155,7 @@ public class EdgeGrpcClient implements EdgeRpcClient { @@ -155,6 +155,7 @@ public class EdgeGrpcClient implements EdgeRpcClient {
155 @Override 155 @Override
156 public void onCompleted() { 156 public void onCompleted() {
157 log.debug("[{}] The rpc session was closed!", edgeKey); 157 log.debug("[{}] The rpc session was closed!", edgeKey);
  158 + onError.accept(new EdgeConnectionException("[" + edgeKey + "] The rpc session was closed!"));
158 } 159 }
159 }; 160 };
160 } 161 }
@@ -35,7 +35,7 @@ import java.util.List; @@ -35,7 +35,7 @@ import java.util.List;
35 public class BaseEdgeEventService implements EdgeEventService { 35 public class BaseEdgeEventService implements EdgeEventService {
36 36
37 @Autowired 37 @Autowired
38 - public EdgeEventDao edgeEventDao; 38 + private EdgeEventDao edgeEventDao;
39 39
40 @Override 40 @Override
41 public ListenableFuture<EdgeEvent> saveAsync(EdgeEvent edgeEvent) { 41 public ListenableFuture<EdgeEvent> saveAsync(EdgeEvent edgeEvent) {
@@ -44,8 +44,8 @@ public class BaseEdgeEventService implements EdgeEventService { @@ -44,8 +44,8 @@ public class BaseEdgeEventService implements EdgeEventService {
44 } 44 }
45 45
46 @Override 46 @Override
47 - public TimePageData<EdgeEvent> findEdgeEvents(TenantId tenantId, EdgeId edgeId, TimePageLink pageLink) {  
48 - List<EdgeEvent> events = edgeEventDao.findEdgeEvents(tenantId.getId(), edgeId, pageLink); 47 + public TimePageData<EdgeEvent> findEdgeEvents(TenantId tenantId, EdgeId edgeId, TimePageLink pageLink, boolean withTsUpdate) {
  48 + List<EdgeEvent> events = edgeEventDao.findEdgeEvents(tenantId.getId(), edgeId, pageLink, withTsUpdate);
49 return new TimePageData<>(events, pageLink); 49 return new TimePageData<>(events, pageLink);
50 } 50 }
51 51
@@ -53,7 +53,7 @@ public class CassandraEdgeEventDao extends CassandraAbstractSearchTimeDao<EdgeEv @@ -53,7 +53,7 @@ public class CassandraEdgeEventDao extends CassandraAbstractSearchTimeDao<EdgeEv
53 } 53 }
54 54
55 @Override 55 @Override
56 - public List<EdgeEvent> findEdgeEvents(UUID tenantId, EdgeId edgeId, TimePageLink pageLink) { 56 + public List<EdgeEvent> findEdgeEvents(UUID tenantId, EdgeId edgeId, TimePageLink pageLink, boolean withTsUpdate) {
57 return null; 57 return null;
58 } 58 }
59 } 59 }
@@ -46,6 +46,6 @@ public interface EdgeEventDao extends Dao<EdgeEvent> { @@ -46,6 +46,6 @@ public interface EdgeEventDao extends Dao<EdgeEvent> {
46 * @param pageLink the pageLink 46 * @param pageLink the pageLink
47 * @return the event list 47 * @return the event list
48 */ 48 */
49 - List<EdgeEvent> findEdgeEvents(UUID tenantId, EdgeId edgeId, TimePageLink pageLink); 49 + List<EdgeEvent> findEdgeEvents(UUID tenantId, EdgeId edgeId, TimePageLink pageLink, boolean withTsUpdate);
50 50
51 } 51 }
@@ -26,6 +26,7 @@ import org.springframework.data.jpa.domain.Specification; @@ -26,6 +26,7 @@ import org.springframework.data.jpa.domain.Specification;
26 import org.springframework.data.repository.CrudRepository; 26 import org.springframework.data.repository.CrudRepository;
27 import org.springframework.stereotype.Component; 27 import org.springframework.stereotype.Component;
28 import org.thingsboard.server.common.data.UUIDConverter; 28 import org.thingsboard.server.common.data.UUIDConverter;
  29 +import org.thingsboard.server.common.data.audit.ActionType;
29 import org.thingsboard.server.common.data.edge.EdgeEvent; 30 import org.thingsboard.server.common.data.edge.EdgeEvent;
30 import org.thingsboard.server.common.data.id.EdgeEventId; 31 import org.thingsboard.server.common.data.id.EdgeEventId;
31 import org.thingsboard.server.common.data.id.EdgeId; 32 import org.thingsboard.server.common.data.id.EdgeId;
@@ -75,9 +76,9 @@ public class JpaBaseEdgeEventDao extends JpaAbstractSearchTimeDao<EdgeEventEntit @@ -75,9 +76,9 @@ public class JpaBaseEdgeEventDao extends JpaAbstractSearchTimeDao<EdgeEventEntit
75 } 76 }
76 77
77 @Override 78 @Override
78 - public List<EdgeEvent> findEdgeEvents(UUID tenantId, EdgeId edgeId, TimePageLink pageLink) { 79 + public List<EdgeEvent> findEdgeEvents(UUID tenantId, EdgeId edgeId, TimePageLink pageLink, boolean withTsUpdate) {
79 Specification<EdgeEventEntity> timeSearchSpec = JpaAbstractSearchTimeDao.getTimeSearchPageSpec(pageLink, "id"); 80 Specification<EdgeEventEntity> timeSearchSpec = JpaAbstractSearchTimeDao.getTimeSearchPageSpec(pageLink, "id");
80 - Specification<EdgeEventEntity> fieldsSpec = getEntityFieldsSpec(tenantId, edgeId); 81 + Specification<EdgeEventEntity> fieldsSpec = getEntityFieldsSpec(tenantId, edgeId, withTsUpdate);
81 Sort.Direction sortDirection = pageLink.isAscOrder() ? Sort.Direction.ASC : Sort.Direction.DESC; 82 Sort.Direction sortDirection = pageLink.isAscOrder() ? Sort.Direction.ASC : Sort.Direction.DESC;
82 Pageable pageable = PageRequest.of(0, pageLink.getLimit(), sortDirection, ID_PROPERTY); 83 Pageable pageable = PageRequest.of(0, pageLink.getLimit(), sortDirection, ID_PROPERTY);
83 return DaoUtil.convertDataList(edgeEventRepository.findAll(Specification.where(timeSearchSpec).and(fieldsSpec), pageable).getContent()); 84 return DaoUtil.convertDataList(edgeEventRepository.findAll(Specification.where(timeSearchSpec).and(fieldsSpec), pageable).getContent());
@@ -95,7 +96,7 @@ public class JpaBaseEdgeEventDao extends JpaAbstractSearchTimeDao<EdgeEventEntit @@ -95,7 +96,7 @@ public class JpaBaseEdgeEventDao extends JpaAbstractSearchTimeDao<EdgeEventEntit
95 return Optional.of(DaoUtil.getData(edgeEventRepository.save(entity))); 96 return Optional.of(DaoUtil.getData(edgeEventRepository.save(entity)));
96 } 97 }
97 98
98 - private Specification<EdgeEventEntity> getEntityFieldsSpec(UUID tenantId, EdgeId edgeId) { 99 + private Specification<EdgeEventEntity> getEntityFieldsSpec(UUID tenantId, EdgeId edgeId, boolean withTsUpdate) {
99 return (root, criteriaQuery, criteriaBuilder) -> { 100 return (root, criteriaQuery, criteriaBuilder) -> {
100 List<Predicate> predicates = new ArrayList<>(); 101 List<Predicate> predicates = new ArrayList<>();
101 if (tenantId != null) { 102 if (tenantId != null) {
@@ -106,6 +107,10 @@ public class JpaBaseEdgeEventDao extends JpaAbstractSearchTimeDao<EdgeEventEntit @@ -106,6 +107,10 @@ public class JpaBaseEdgeEventDao extends JpaAbstractSearchTimeDao<EdgeEventEntit
106 Predicate entityIdPredicate = criteriaBuilder.equal(root.get("edgeId"), UUIDConverter.fromTimeUUID(edgeId.getId())); 107 Predicate entityIdPredicate = criteriaBuilder.equal(root.get("edgeId"), UUIDConverter.fromTimeUUID(edgeId.getId()));
107 predicates.add(entityIdPredicate); 108 predicates.add(entityIdPredicate);
108 } 109 }
  110 + if (!withTsUpdate) {
  111 + Predicate edgeEventActionPredicate = criteriaBuilder.notEqual(root.get("edgeEventAction"), ActionType.TIMESERIES_UPDATED.name());
  112 + predicates.add(edgeEventActionPredicate);
  113 + }
109 return criteriaBuilder.and(predicates.toArray(new Predicate[]{})); 114 return criteriaBuilder.and(predicates.toArray(new Predicate[]{}));
110 }; 115 };
111 } 116 }
@@ -19,6 +19,7 @@ import com.datastax.driver.core.utils.UUIDs; @@ -19,6 +19,7 @@ import com.datastax.driver.core.utils.UUIDs;
19 import org.junit.Assert; 19 import org.junit.Assert;
20 import org.junit.Test; 20 import org.junit.Test;
21 import org.thingsboard.server.common.data.DataConstants; 21 import org.thingsboard.server.common.data.DataConstants;
  22 +import org.thingsboard.server.common.data.audit.ActionType;
22 import org.thingsboard.server.common.data.edge.EdgeEvent; 23 import org.thingsboard.server.common.data.edge.EdgeEvent;
23 import org.thingsboard.server.common.data.edge.EdgeEventType; 24 import org.thingsboard.server.common.data.edge.EdgeEventType;
24 import org.thingsboard.server.common.data.id.DeviceId; 25 import org.thingsboard.server.common.data.id.DeviceId;
@@ -82,7 +83,7 @@ public abstract class BaseEdgeEventServiceTest extends AbstractServiceTest { @@ -82,7 +83,7 @@ public abstract class BaseEdgeEventServiceTest extends AbstractServiceTest {
82 EdgeEvent savedEdgeEvent3 = saveEdgeEventWithProvidedTime(eventTime + 2, edgeId, deviceId, tenantId); 83 EdgeEvent savedEdgeEvent3 = saveEdgeEventWithProvidedTime(eventTime + 2, edgeId, deviceId, tenantId);
83 saveEdgeEventWithProvidedTime(timeAfterEndTime, edgeId, deviceId, tenantId); 84 saveEdgeEventWithProvidedTime(timeAfterEndTime, edgeId, deviceId, tenantId);
84 85
85 - TimePageData<EdgeEvent> edgeEvents = edgeEventService.findEdgeEvents(tenantId, edgeId, new TimePageLink(2, startTime, endTime, false)); 86 + TimePageData<EdgeEvent> edgeEvents = edgeEventService.findEdgeEvents(tenantId, edgeId, new TimePageLink(2, startTime, endTime, false), true);
86 87
87 Assert.assertNotNull(edgeEvents.getData()); 88 Assert.assertNotNull(edgeEvents.getData());
88 Assert.assertTrue(edgeEvents.getData().size() == 2); 89 Assert.assertTrue(edgeEvents.getData().size() == 2);
@@ -91,7 +92,7 @@ public abstract class BaseEdgeEventServiceTest extends AbstractServiceTest { @@ -91,7 +92,7 @@ public abstract class BaseEdgeEventServiceTest extends AbstractServiceTest {
91 Assert.assertTrue(edgeEvents.hasNext()); 92 Assert.assertTrue(edgeEvents.hasNext());
92 Assert.assertNotNull(edgeEvents.getNextPageLink()); 93 Assert.assertNotNull(edgeEvents.getNextPageLink());
93 94
94 - edgeEvents = edgeEventService.findEdgeEvents(tenantId, edgeId, edgeEvents.getNextPageLink()); 95 + edgeEvents = edgeEventService.findEdgeEvents(tenantId, edgeId, edgeEvents.getNextPageLink(), true);
95 96
96 Assert.assertNotNull(edgeEvents.getData()); 97 Assert.assertNotNull(edgeEvents.getData());
97 Assert.assertTrue(edgeEvents.getData().size() == 1); 98 Assert.assertTrue(edgeEvents.getData().size() == 1);
@@ -100,6 +101,26 @@ public abstract class BaseEdgeEventServiceTest extends AbstractServiceTest { @@ -100,6 +101,26 @@ public abstract class BaseEdgeEventServiceTest extends AbstractServiceTest {
100 Assert.assertNull(edgeEvents.getNextPageLink()); 101 Assert.assertNull(edgeEvents.getNextPageLink());
101 } 102 }
102 103
  104 + @Test
  105 + public void findEdgeEventsWithTsUpdateAndWithout() throws Exception {
  106 + EdgeId edgeId = new EdgeId(UUIDs.timeBased());
  107 + DeviceId deviceId = new DeviceId(UUIDs.timeBased());
  108 + TenantId tenantId = new TenantId(UUIDs.timeBased());
  109 + TimePageLink pageLink = new TimePageLink(1);
  110 +
  111 + EdgeEvent edgeEventWithTsUpdate = generateEdgeEvent(tenantId, edgeId, deviceId, ActionType.TIMESERIES_UPDATED.name());
  112 + edgeEventService.saveAsync(edgeEventWithTsUpdate);
  113 +
  114 + TimePageData<EdgeEvent> allEdgeEvents = edgeEventService.findEdgeEvents(tenantId, edgeId, pageLink, true);
  115 + TimePageData<EdgeEvent> edgeEventsWithoutTsUpdate = edgeEventService.findEdgeEvents(tenantId, edgeId, pageLink, false);
  116 +
  117 + Assert.assertNotNull(allEdgeEvents.getData());
  118 + Assert.assertNotNull(edgeEventsWithoutTsUpdate.getData());
  119 + Assert.assertEquals(1, allEdgeEvents.getData().size());
  120 + Assert.assertEquals(allEdgeEvents.getData().get(0).getUuidId(), edgeEventWithTsUpdate.getUuidId());
  121 + Assert.assertTrue(edgeEventsWithoutTsUpdate.getData().isEmpty());
  122 + }
  123 +
103 private EdgeEvent saveEdgeEventWithProvidedTime(long time, EdgeId edgeId, EntityId entityId, TenantId tenantId) throws Exception { 124 private EdgeEvent saveEdgeEventWithProvidedTime(long time, EdgeId edgeId, EntityId entityId, TenantId tenantId) throws Exception {
104 EdgeEvent edgeEvent = generateEdgeEvent(tenantId, edgeId, entityId, DataConstants.ENTITY_CREATED); 125 EdgeEvent edgeEvent = generateEdgeEvent(tenantId, edgeId, entityId, DataConstants.ENTITY_CREATED);
105 edgeEvent.setId(new EdgeEventId(UUIDs.startOf(time))); 126 edgeEvent.setId(new EdgeEventId(UUIDs.startOf(time)));