Moved toSort from DaoUtil to PageLink/TimePageLink classes

This commit is contained in:
Volodymyr Babak 2021-12-22 17:10:28 +02:00
parent 5cbc78fbf4
commit 1934b7387d
5 changed files with 74 additions and 50 deletions

View File

@ -64,6 +64,10 @@
<groupId>com.fasterxml.jackson.core</groupId> <groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId> <artifactId>jackson-databind</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId> <artifactId>spring-boot-starter-test</artifactId>

View File

@ -18,9 +18,19 @@ package org.thingsboard.server.common.data.page;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data; 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 @Data
public class PageLink { 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 String textSearch;
private final int pageSize; private final int pageSize;
private final int page; private final int page;
@ -57,4 +67,28 @@ public class PageLink {
return new PageLink(this.pageSize, this.page+1, this.textSearch, this.sortOrder); return new PageLink(this.pageSize, this.page+1, this.textSearch, this.sortOrder);
} }
public Sort toSort(SortOrder sortOrder, Map<String,String> 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<SortOrder> sortOrders, Map<String,String> columnMap) {
return Sort.by(sortOrders.stream().map(s -> toSortOrder(s, columnMap)).collect(Collectors.toList()));
}
private Sort.Order toSortOrder(SortOrder sortOrder, Map<String,String> 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);
}
} }

View File

@ -19,6 +19,11 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.ToString; import lombok.ToString;
import org.springframework.data.domain.Sort;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Data @Data
@ToString(callSuper = true) @ToString(callSuper = true)
@ -61,4 +66,30 @@ public class TimePageLink extends PageLink {
return new TimePageLink(this.getPageSize(), this.getPage()+1, this.getTextSearch(), this.getSortOrder(), return new TimePageLink(this.getPageSize(), this.getPage()+1, this.getTextSearch(), this.getSortOrder(),
this.startTime, this.endTime); this.startTime, this.endTime);
} }
@Override
public Sort toSort(SortOrder sortOrder, Map<String,String> columnMap) {
if (sortOrder == null) {
return super.toSort(sortOrder, columnMap);
} else {
return toSort(new ArrayList<>(List.of(sortOrder)), columnMap);
}
}
@Override
public Sort toSort(List<SortOrder> sortOrders, Map<String,String> columnMap) {
if (!isDefaultSortOrderAvailable(sortOrders)) {
sortOrders.add(new SortOrder(DEFAULT_SORT_PROPERTY, SortOrder.Direction.ASC));
}
return super.toSort(sortOrders, columnMap);
}
private boolean isDefaultSortOrderAvailable(List<SortOrder> sortOrders) {
for (SortOrder sortOrder : sortOrders) {
if (DEFAULT_SORT_PROPERTY.equals(sortOrder.getProperty())) {
return true;
}
}
return false;
}
} }

View File

@ -18,7 +18,7 @@ package org.thingsboard.server.dao;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable; 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.id.UUIDBased;
import org.thingsboard.server.common.data.page.PageData; import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.common.data.page.PageLink;
@ -32,13 +32,9 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.UUID; import java.util.UUID;
import java.util.stream.Collectors;
public abstract class DaoUtil { 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() { private DaoUtil() {
} }
@ -56,7 +52,7 @@ public abstract class DaoUtil {
} }
public static Pageable toPageable(PageLink pageLink, Map<String,String> columnMap) { public static Pageable toPageable(PageLink pageLink, Map<String,String> 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<SortOrder> sortOrders) { public static Pageable toPageable(PageLink pageLink, List<SortOrder> sortOrders) {
@ -64,43 +60,7 @@ public abstract class DaoUtil {
} }
public static Pageable toPageable(PageLink pageLink, Map<String,String> columnMap, List<SortOrder> sortOrders) { public static Pageable toPageable(PageLink pageLink, Map<String,String> columnMap, List<SortOrder> sortOrders) {
return PageRequest.of(pageLink.getPage(), pageLink.getPageSize(), toSort(sortOrders, columnMap)); return PageRequest.of(pageLink.getPage(), pageLink.getPageSize(), pageLink.toSort(sortOrders, columnMap));
}
public static Sort toSort(SortOrder sortOrder) {
return toSort(sortOrder, Collections.emptyMap());
}
public static Sort toSort(SortOrder sortOrder, Map<String,String> 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<SortOrder> sortOrders) {
return toSort(sortOrders, Collections.emptyMap());
}
public static Sort toSort(List<SortOrder> sortOrders, Map<String,String> columnMap) {
return toSort(sortOrders, columnMap, Sort.NullHandling.NULLS_LAST);
}
public static Sort toSort(List<SortOrder> sortOrders, Map<String,String> 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<String,String> 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);
} }
public static <T> List<T> convertDataList(Collection<? extends ToData<T>> toDataList) { public static <T> List<T> convertDataList(Collection<? extends ToData<T>> toDataList) {

View File

@ -99,11 +99,6 @@ public class JpaBaseEdgeEventDao extends JpaAbstractSearchTextDao<EdgeEventEntit
@Override @Override
public PageData<EdgeEvent> findEdgeEvents(UUID tenantId, EdgeId edgeId, TimePageLink pageLink, boolean withTsUpdate) { public PageData<EdgeEvent> findEdgeEvents(UUID tenantId, EdgeId edgeId, TimePageLink pageLink, boolean withTsUpdate) {
List<SortOrder> 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()); final Lock readWriteLock = readWriteLocks.computeIfAbsent(edgeId, id -> new ReentrantLock());
readWriteLock.lock(); readWriteLock.lock();
try { try {
@ -116,7 +111,7 @@ public class JpaBaseEdgeEventDao extends JpaAbstractSearchTextDao<EdgeEventEntit
Objects.toString(pageLink.getTextSearch(), ""), Objects.toString(pageLink.getTextSearch(), ""),
pageLink.getStartTime(), pageLink.getStartTime(),
pageLink.getEndTime(), pageLink.getEndTime(),
DaoUtil.toPageable(pageLink, sortOrders))); DaoUtil.toPageable(pageLink)));
} else { } else {
return DaoUtil.toPageData( return DaoUtil.toPageData(
edgeEventRepository edgeEventRepository
@ -126,7 +121,7 @@ public class JpaBaseEdgeEventDao extends JpaAbstractSearchTextDao<EdgeEventEntit
Objects.toString(pageLink.getTextSearch(), ""), Objects.toString(pageLink.getTextSearch(), ""),
pageLink.getStartTime(), pageLink.getStartTime(),
pageLink.getEndTime(), pageLink.getEndTime(),
DaoUtil.toPageable(pageLink, sortOrders))); DaoUtil.toPageable(pageLink)));
} }
} finally { } finally {