diff --git a/common/data/pom.xml b/common/data/pom.xml
index 80be41e6a0..5a5838d7da 100644
--- a/common/data/pom.xml
+++ b/common/data/pom.xml
@@ -64,6 +64,10 @@
com.fasterxml.jackson.core
jackson-databind
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
org.springframework.boot
spring-boot-starter-test
diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/page/PageLink.java b/common/data/src/main/java/org/thingsboard/server/common/data/page/PageLink.java
index a31f834068..acf0d2f71e 100644
--- a/common/data/src/main/java/org/thingsboard/server/common/data/page/PageLink.java
+++ b/common/data/src/main/java/org/thingsboard/server/common/data/page/PageLink.java
@@ -18,9 +18,19 @@ package org.thingsboard.server.common.data.page;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
+import org.springframework.data.domain.Sort;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
@Data
public class PageLink {
+ protected static final String DEFAULT_SORT_PROPERTY = "id";
+ private static final Sort DEFAULT_SORT = Sort.by(Sort.Direction.ASC, DEFAULT_SORT_PROPERTY);
+
private final String textSearch;
private final int pageSize;
private final int page;
@@ -57,4 +67,28 @@ public class PageLink {
return new PageLink(this.pageSize, this.page+1, this.textSearch, this.sortOrder);
}
+ public Sort toSort(SortOrder sortOrder, Map columnMap) {
+ if (sortOrder == null) {
+ return DEFAULT_SORT;
+ } else {
+ String property = sortOrder.getProperty();
+ if (columnMap.containsKey(property)) {
+ property = columnMap.get(property);
+ }
+ return Sort.by(Sort.Direction.fromString(sortOrder.getDirection().name()), property);
+ }
+ }
+
+ public Sort toSort(List sortOrders, Map columnMap) {
+ return Sort.by(sortOrders.stream().map(s -> toSortOrder(s, columnMap)).collect(Collectors.toList()));
+ }
+
+ private Sort.Order toSortOrder(SortOrder sortOrder, Map columnMap) {
+ String property = sortOrder.getProperty();
+ if (columnMap.containsKey(property)) {
+ property = columnMap.get(property);
+ }
+ return new Sort.Order(Sort.Direction.fromString(sortOrder.getDirection().name()), property, Sort.NullHandling.NULLS_LAST);
+ }
+
}
diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/page/TimePageLink.java b/common/data/src/main/java/org/thingsboard/server/common/data/page/TimePageLink.java
index be4878b50e..7be6f1ec8b 100644
--- a/common/data/src/main/java/org/thingsboard/server/common/data/page/TimePageLink.java
+++ b/common/data/src/main/java/org/thingsboard/server/common/data/page/TimePageLink.java
@@ -19,6 +19,11 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
+import org.springframework.data.domain.Sort;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
@Data
@ToString(callSuper = true)
@@ -61,4 +66,30 @@ public class TimePageLink extends PageLink {
return new TimePageLink(this.getPageSize(), this.getPage()+1, this.getTextSearch(), this.getSortOrder(),
this.startTime, this.endTime);
}
+
+ @Override
+ public Sort toSort(SortOrder sortOrder, Map columnMap) {
+ if (sortOrder == null) {
+ return super.toSort(sortOrder, columnMap);
+ } else {
+ return toSort(new ArrayList<>(List.of(sortOrder)), columnMap);
+ }
+ }
+
+ @Override
+ public Sort toSort(List sortOrders, Map columnMap) {
+ if (!isDefaultSortOrderAvailable(sortOrders)) {
+ sortOrders.add(new SortOrder(DEFAULT_SORT_PROPERTY, SortOrder.Direction.ASC));
+ }
+ return super.toSort(sortOrders, columnMap);
+ }
+
+ private boolean isDefaultSortOrderAvailable(List sortOrders) {
+ for (SortOrder sortOrder : sortOrders) {
+ if (DEFAULT_SORT_PROPERTY.equals(sortOrder.getProperty())) {
+ return true;
+ }
+ }
+ return false;
+ }
}
diff --git a/dao/src/main/java/org/thingsboard/server/dao/DaoUtil.java b/dao/src/main/java/org/thingsboard/server/dao/DaoUtil.java
index 19f613bd30..b6ab190573 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/DaoUtil.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/DaoUtil.java
@@ -18,7 +18,7 @@ package org.thingsboard.server.dao;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
-import org.springframework.data.domain.Sort;
+
import org.thingsboard.server.common.data.id.UUIDBased;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink;
@@ -32,13 +32,9 @@ import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.UUID;
-import java.util.stream.Collectors;
public abstract class DaoUtil {
- public static final String DEFAULT_SORT_PROPERTY = "id";
- public static final Sort DEFAULT_SORT = Sort.by(Sort.Direction.ASC, DEFAULT_SORT_PROPERTY);
-
private DaoUtil() {
}
@@ -56,7 +52,7 @@ public abstract class DaoUtil {
}
public static Pageable toPageable(PageLink pageLink, Map columnMap) {
- return PageRequest.of(pageLink.getPage(), pageLink.getPageSize(), toSort(pageLink.getSortOrder(), columnMap));
+ return PageRequest.of(pageLink.getPage(), pageLink.getPageSize(), pageLink.toSort(pageLink.getSortOrder(), columnMap));
}
public static Pageable toPageable(PageLink pageLink, List sortOrders) {
@@ -64,43 +60,7 @@ public abstract class DaoUtil {
}
public static Pageable toPageable(PageLink pageLink, Map columnMap, List sortOrders) {
- return PageRequest.of(pageLink.getPage(), pageLink.getPageSize(), toSort(sortOrders, columnMap));
- }
-
- public static Sort toSort(SortOrder sortOrder) {
- return toSort(sortOrder, Collections.emptyMap());
- }
-
- public static Sort toSort(SortOrder sortOrder, Map columnMap) {
- if (sortOrder == null) {
- return DEFAULT_SORT;
- } else {
- String property = sortOrder.getProperty();
- if (columnMap.containsKey(property)) {
- property = columnMap.get(property);
- }
- return Sort.by(Sort.Direction.fromString(sortOrder.getDirection().name()), property);
- }
- }
-
- public static Sort toSort(List sortOrders) {
- return toSort(sortOrders, Collections.emptyMap());
- }
-
- public static Sort toSort(List sortOrders, Map columnMap) {
- return toSort(sortOrders, columnMap, Sort.NullHandling.NULLS_LAST);
- }
-
- public static Sort toSort(List sortOrders, Map columnMap, Sort.NullHandling nullHandlingHint) {
- return Sort.by(sortOrders.stream().map(s -> toSortOrder(s, columnMap, nullHandlingHint)).collect(Collectors.toList()));
- }
-
- public static Sort.Order toSortOrder(SortOrder sortOrder, Map columnMap, Sort.NullHandling nullHandlingHint) {
- String property = sortOrder.getProperty();
- if (columnMap.containsKey(property)) {
- property = columnMap.get(property);
- }
- return new Sort.Order(Sort.Direction.fromString(sortOrder.getDirection().name()), property, nullHandlingHint);
+ return PageRequest.of(pageLink.getPage(), pageLink.getPageSize(), pageLink.toSort(sortOrders, columnMap));
}
public static List convertDataList(Collection extends ToData> toDataList) {
diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/edge/JpaBaseEdgeEventDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/edge/JpaBaseEdgeEventDao.java
index 8645efccf7..dfb00eafcc 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/sql/edge/JpaBaseEdgeEventDao.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/sql/edge/JpaBaseEdgeEventDao.java
@@ -99,11 +99,6 @@ public class JpaBaseEdgeEventDao extends JpaAbstractSearchTextDao findEdgeEvents(UUID tenantId, EdgeId edgeId, TimePageLink pageLink, boolean withTsUpdate) {
- List sortOrders = new ArrayList<>();
- sortOrders.add(new SortOrder("id", SortOrder.Direction.ASC));
- if (pageLink.getSortOrder() != null) {
- sortOrders.add(pageLink.getSortOrder());
- }
final Lock readWriteLock = readWriteLocks.computeIfAbsent(edgeId, id -> new ReentrantLock());
readWriteLock.lock();
try {
@@ -116,7 +111,7 @@ public class JpaBaseEdgeEventDao extends JpaAbstractSearchTextDao