Added findRelations impl. Minor fixes
This commit is contained in:
parent
9f16c08401
commit
cb41480be7
@ -172,6 +172,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.h2database</groupId>
|
<groupId>com.h2database</groupId>
|
||||||
<artifactId>h2</artifactId>
|
<artifactId>h2</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<build>
|
<build>
|
||||||
|
|||||||
@ -47,8 +47,8 @@ public abstract class CassandraAbstractModelDao<E extends BaseEntity<D>, D> exte
|
|||||||
|
|
||||||
protected abstract String getColumnFamilyName();
|
protected abstract String getColumnFamilyName();
|
||||||
|
|
||||||
protected boolean isSearchTextDao() {
|
protected E updateSearchTextIfPresent(E entity) {
|
||||||
return false;
|
return entity;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Mapper<E> getMapper() {
|
protected Mapper<E> getMapper() {
|
||||||
@ -153,9 +153,7 @@ public abstract class CassandraAbstractModelDao<E extends BaseEntity<D>, D> exte
|
|||||||
log.error("Can't create entity for domain object {}", domain, e);
|
log.error("Can't create entity for domain object {}", domain, e);
|
||||||
throw new IllegalArgumentException("Can't create entity for domain object {" + domain + "}", e);
|
throw new IllegalArgumentException("Can't create entity for domain object {" + domain + "}", e);
|
||||||
}
|
}
|
||||||
if (isSearchTextDao()) {
|
entity = updateSearchTextIfPresent(entity);
|
||||||
((SearchTextEntity) entity).setSearchText(((SearchTextEntity) entity).getSearchTextSource().toLowerCase());
|
|
||||||
}
|
|
||||||
log.debug("Saving entity {}", entity);
|
log.debug("Saving entity {}", entity);
|
||||||
entity = saveWithResult(entity).getEntity();
|
entity = saveWithResult(entity).getEntity();
|
||||||
return DaoUtil.getData(entity);
|
return DaoUtil.getData(entity);
|
||||||
|
|||||||
@ -34,8 +34,13 @@ import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
|
|||||||
public abstract class CassandraAbstractSearchTextDao<E extends SearchTextEntity<D>, D> extends CassandraAbstractModelDao<E, D> {
|
public abstract class CassandraAbstractSearchTextDao<E extends SearchTextEntity<D>, D> extends CassandraAbstractModelDao<E, D> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean isSearchTextDao() {
|
protected E updateSearchTextIfPresent(E entity) {
|
||||||
return true;
|
if (entity.getSearchTextSource() != null) {
|
||||||
|
entity.setSearchText(entity.getSearchTextSource().toLowerCase());
|
||||||
|
} else {
|
||||||
|
log.trace("Entity [{}] has null SearchTextSource", entity);
|
||||||
|
}
|
||||||
|
return entity;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected List<E> findPageWithTextSearch(String searchView, List<Clause> clauses, TextPageLink pageLink) {
|
protected List<E> findPageWithTextSearch(String searchView, List<Clause> clauses, TextPageLink pageLink) {
|
||||||
|
|||||||
@ -34,43 +34,41 @@ import java.util.UUID;
|
|||||||
*/
|
*/
|
||||||
public abstract class JpaAbstractSearchTimeDao<E extends BaseEntity<D>, D> extends JpaAbstractDao<E, D> {
|
public abstract class JpaAbstractSearchTimeDao<E extends BaseEntity<D>, D> extends JpaAbstractDao<E, D> {
|
||||||
|
|
||||||
protected Specification<E> getTimeSearchPageSpec(TimePageLink pageLink) {
|
public static <T> Specification<T> getTimeSearchPageSpec(TimePageLink pageLink, String idColumn) {
|
||||||
return new Specification<E>() {
|
return new Specification<T>() {
|
||||||
@Override
|
@Override
|
||||||
public Predicate toPredicate(Root<E> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
|
public Predicate toPredicate(Root<T> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
|
||||||
Predicate lowerBound = null;
|
|
||||||
Predicate upperBound = null;
|
|
||||||
List<Predicate> predicates = new ArrayList<>();
|
List<Predicate> predicates = new ArrayList<>();
|
||||||
if (pageLink.isAscOrder()) {
|
if (pageLink.isAscOrder()) {
|
||||||
if (pageLink.getIdOffset() != null) {
|
if (pageLink.getIdOffset() != null) {
|
||||||
lowerBound = criteriaBuilder.greaterThan(root.get(ID_PROPERTY), pageLink.getIdOffset());
|
Predicate lowerBound = criteriaBuilder.greaterThan(root.get(idColumn), pageLink.getIdOffset());
|
||||||
predicates.add(lowerBound);
|
predicates.add(lowerBound);
|
||||||
} else if (pageLink.getStartTime() != null) {
|
} else if (pageLink.getStartTime() != null) {
|
||||||
UUID startOf = UUIDs.startOf(pageLink.getStartTime());
|
UUID startOf = UUIDs.startOf(pageLink.getStartTime());
|
||||||
lowerBound = criteriaBuilder.greaterThanOrEqualTo(root.get(ID_PROPERTY), startOf);
|
Predicate lowerBound = criteriaBuilder.greaterThanOrEqualTo(root.get(idColumn), startOf);
|
||||||
predicates.add(lowerBound);
|
predicates.add(lowerBound);
|
||||||
}
|
}
|
||||||
if (pageLink.getEndTime() != null) {
|
if (pageLink.getEndTime() != null) {
|
||||||
UUID endOf = UUIDs.endOf(pageLink.getEndTime());
|
UUID endOf = UUIDs.endOf(pageLink.getEndTime());
|
||||||
upperBound = criteriaBuilder.lessThanOrEqualTo(root.get(ID_PROPERTY), endOf);
|
Predicate upperBound = criteriaBuilder.lessThanOrEqualTo(root.get(idColumn), endOf);
|
||||||
predicates.add(upperBound);
|
predicates.add(upperBound);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (pageLink.getIdOffset() != null) {
|
if (pageLink.getIdOffset() != null) {
|
||||||
lowerBound = criteriaBuilder.lessThan(root.get(ID_PROPERTY), pageLink.getIdOffset());
|
Predicate lowerBound = criteriaBuilder.lessThan(root.get(idColumn), pageLink.getIdOffset());
|
||||||
predicates.add(lowerBound);
|
predicates.add(lowerBound);
|
||||||
} else if (pageLink.getEndTime() != null) {
|
} else if (pageLink.getEndTime() != null) {
|
||||||
UUID endOf = UUIDs.endOf(pageLink.getEndTime());
|
UUID endOf = UUIDs.endOf(pageLink.getEndTime());
|
||||||
lowerBound = criteriaBuilder.lessThanOrEqualTo(root.get(ID_PROPERTY), endOf);
|
Predicate lowerBound = criteriaBuilder.lessThanOrEqualTo(root.get(idColumn), endOf);
|
||||||
predicates.add(lowerBound);
|
predicates.add(lowerBound);
|
||||||
}
|
}
|
||||||
if (pageLink.getStartTime() != null) {
|
if (pageLink.getStartTime() != null) {
|
||||||
UUID startOf = UUIDs.startOf(pageLink.getStartTime());
|
UUID startOf = UUIDs.startOf(pageLink.getStartTime());
|
||||||
upperBound = criteriaBuilder.greaterThanOrEqualTo(root.get(ID_PROPERTY), startOf);
|
Predicate upperBound = criteriaBuilder.greaterThanOrEqualTo(root.get(idColumn), startOf);
|
||||||
predicates.add(upperBound);
|
predicates.add(upperBound);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
|
return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@ -100,7 +100,7 @@ public class JpaBaseEventDao extends JpaAbstractSearchTimeDao<EventEntity, Event
|
|||||||
}
|
}
|
||||||
@Override
|
@Override
|
||||||
public List<Event> findEvents(UUID tenantId, EntityId entityId, String eventType, TimePageLink pageLink) {
|
public List<Event> findEvents(UUID tenantId, EntityId entityId, String eventType, TimePageLink pageLink) {
|
||||||
Specification<EventEntity> timeSearchSpec = getTimeSearchPageSpec(pageLink);
|
Specification<EventEntity> timeSearchSpec = JpaAbstractSearchTimeDao.<EventEntity>getTimeSearchPageSpec(pageLink, ID_PROPERTY);
|
||||||
Specification<EventEntity> fieldsSpec = getEntityFieldsSpec(tenantId, entityId, eventType);
|
Specification<EventEntity> fieldsSpec = getEntityFieldsSpec(tenantId, entityId, eventType);
|
||||||
Sort.Direction sortDirection = pageLink.isAscOrder() ? Sort.Direction.ASC : Sort.Direction.DESC;
|
Sort.Direction sortDirection = pageLink.isAscOrder() ? Sort.Direction.ASC : Sort.Direction.DESC;
|
||||||
Pageable pageable = new PageRequest(0, pageLink.getLimit(), sortDirection, ID_PROPERTY);
|
Pageable pageable = new PageRequest(0, pageLink.getLimit(), sortDirection, ID_PROPERTY);
|
||||||
@ -136,15 +136,15 @@ public class JpaBaseEventDao extends JpaAbstractSearchTimeDao<EventEntity, Event
|
|||||||
}
|
}
|
||||||
if (entityId != null) {
|
if (entityId != null) {
|
||||||
Predicate entityTypePredicate = criteriaBuilder.equal(root.get("entityType"), entityId.getEntityType());
|
Predicate entityTypePredicate = criteriaBuilder.equal(root.get("entityType"), entityId.getEntityType());
|
||||||
Predicate entityIdPredicate = criteriaBuilder.equal(root.get("entityId"), entityId.getId());
|
|
||||||
predicates.add(entityTypePredicate);
|
predicates.add(entityTypePredicate);
|
||||||
|
Predicate entityIdPredicate = criteriaBuilder.equal(root.get("entityId"), entityId.getId());
|
||||||
predicates.add(entityIdPredicate);
|
predicates.add(entityIdPredicate);
|
||||||
}
|
}
|
||||||
if (eventType != null) {
|
if (eventType != null) {
|
||||||
Predicate eventTypePredicate = criteriaBuilder.equal(root.get("eventType"), eventType);
|
Predicate eventTypePredicate = criteriaBuilder.equal(root.get("eventType"), eventType);
|
||||||
predicates.add(eventTypePredicate);
|
predicates.add(eventTypePredicate);
|
||||||
}
|
}
|
||||||
return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
|
return criteriaBuilder.and(predicates.toArray(new Predicate[]{}));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@ -21,6 +21,11 @@ import com.google.common.util.concurrent.MoreExecutors;
|
|||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||||
|
import org.springframework.data.domain.PageRequest;
|
||||||
|
import org.springframework.data.domain.Pageable;
|
||||||
|
import org.springframework.data.domain.Sort;
|
||||||
|
import org.springframework.data.domain.Sort.Order;
|
||||||
|
import org.springframework.data.jpa.domain.Specification;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import org.thingsboard.server.common.data.EntityType;
|
import org.thingsboard.server.common.data.EntityType;
|
||||||
import org.thingsboard.server.common.data.id.EntityId;
|
import org.thingsboard.server.common.data.id.EntityId;
|
||||||
@ -31,10 +36,20 @@ import org.thingsboard.server.dao.DaoUtil;
|
|||||||
import org.thingsboard.server.dao.model.sql.RelationCompositeKey;
|
import org.thingsboard.server.dao.model.sql.RelationCompositeKey;
|
||||||
import org.thingsboard.server.dao.model.sql.RelationEntity;
|
import org.thingsboard.server.dao.model.sql.RelationEntity;
|
||||||
import org.thingsboard.server.dao.relation.RelationDao;
|
import org.thingsboard.server.dao.relation.RelationDao;
|
||||||
|
import org.thingsboard.server.dao.sql.JpaAbstractSearchTimeDao;
|
||||||
|
|
||||||
|
import javax.persistence.criteria.CriteriaBuilder;
|
||||||
|
import javax.persistence.criteria.CriteriaQuery;
|
||||||
|
import javax.persistence.criteria.Predicate;
|
||||||
|
import javax.persistence.criteria.Root;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.Executors;
|
import java.util.concurrent.Executors;
|
||||||
|
|
||||||
|
import static org.springframework.data.domain.Sort.Direction.ASC;
|
||||||
|
import static org.springframework.data.jpa.domain.Specifications.where;
|
||||||
|
import static org.thingsboard.server.dao.model.ModelConstants.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by Valerii Sosliuk on 5/29/2017.
|
* Created by Valerii Sosliuk on 5/29/2017.
|
||||||
*/
|
*/
|
||||||
@ -149,15 +164,43 @@ public class JpaRelationDao implements RelationDao {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ListenableFuture<List<EntityRelation>> findRelations(EntityId from, String relationType, RelationTypeGroup typeGroup, EntityType childType, TimePageLink pageLink) {
|
public ListenableFuture<List<EntityRelation>> findRelations(EntityId from, String relationType, RelationTypeGroup typeGroup, EntityType childType, TimePageLink pageLink) {
|
||||||
// TODO:
|
Specification<RelationEntity> timeSearchSpec = JpaAbstractSearchTimeDao.<RelationEntity>getTimeSearchPageSpec(pageLink, RELATION_TO_ID_PROPERTY);
|
||||||
// executorService.submit(() -> DaoUtil.convertDataList(
|
Specification<RelationEntity> fieldsSpec = getEntityFieldsSpec(from, relationType, typeGroup, childType);
|
||||||
// relationRepository.findRelations(
|
Pageable pageable = new PageRequest(0, pageLink.getLimit(),
|
||||||
// to.getId(),
|
new Sort(
|
||||||
// to.getEntityType().name(),
|
new Order(ASC, RELATION_TYPE_GROUP_PROPERTY),
|
||||||
// relationType,
|
new Order(ASC, RELATION_TYPE_PROPERTY),
|
||||||
// typeGroup.name())));
|
new Order(ASC, RELATION_TO_TYPE_PROPERTY))
|
||||||
return null;
|
);
|
||||||
|
return executorService.submit(() ->
|
||||||
|
DaoUtil.convertDataList(relationRepository.findAll(where(timeSearchSpec).and(fieldsSpec), pageable).getContent()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Specification<RelationEntity> getEntityFieldsSpec(EntityId from, String relationType, RelationTypeGroup typeGroup, EntityType childType) {
|
||||||
|
return new Specification<RelationEntity>() {
|
||||||
|
@Override
|
||||||
|
public Predicate toPredicate(Root<RelationEntity> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
|
||||||
|
List<Predicate> predicates = new ArrayList<>();
|
||||||
|
if (from != null) {
|
||||||
|
Predicate fromIdPredicate = criteriaBuilder.equal(root.get(RELATION_FROM_ID_PROPERTY), from.getId());
|
||||||
|
predicates.add(fromIdPredicate);
|
||||||
|
Predicate fromEntityTypePredicate = criteriaBuilder.equal(root.get(RELATION_FROM_TYPE_PROPERTY), from.getEntityType().name());
|
||||||
|
predicates.add(fromEntityTypePredicate);
|
||||||
|
}
|
||||||
|
if (relationType != null) {
|
||||||
|
Predicate relationTypePredicate = criteriaBuilder.equal(root.get(RELATION_TYPE_PROPERTY), relationType);
|
||||||
|
predicates.add(relationTypePredicate);
|
||||||
|
}
|
||||||
|
if (typeGroup != null) {
|
||||||
|
Predicate typeGroupPredicate = criteriaBuilder.equal(root.get(RELATION_TYPE_GROUP_PROPERTY), typeGroup);
|
||||||
|
predicates.add(typeGroupPredicate);
|
||||||
|
}
|
||||||
|
if (childType != null) {
|
||||||
|
Predicate childTypePredicate = criteriaBuilder.equal(root.get(RELATION_TO_TYPE_PROPERTY), childType.name());
|
||||||
|
predicates.add(childTypePredicate);
|
||||||
|
}
|
||||||
|
return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -16,6 +16,7 @@
|
|||||||
package org.thingsboard.server.dao.sql.relation;
|
package org.thingsboard.server.dao.sql.relation;
|
||||||
|
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||||
|
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
|
||||||
import org.springframework.data.repository.CrudRepository;
|
import org.springframework.data.repository.CrudRepository;
|
||||||
import org.thingsboard.server.dao.model.sql.RelationCompositeKey;
|
import org.thingsboard.server.dao.model.sql.RelationCompositeKey;
|
||||||
import org.thingsboard.server.dao.model.sql.RelationEntity;
|
import org.thingsboard.server.dao.model.sql.RelationEntity;
|
||||||
@ -24,7 +25,8 @@ import java.util.List;
|
|||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
@ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true")
|
@ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true")
|
||||||
public interface RelationRepository extends CrudRepository<RelationEntity, RelationCompositeKey> {
|
public interface RelationRepository
|
||||||
|
extends CrudRepository<RelationEntity, RelationCompositeKey>, JpaSpecificationExecutor<RelationEntity> {
|
||||||
|
|
||||||
List<RelationEntity> findAllByFromIdAndFromTypeAndRelationTypeGroup(UUID fromId,
|
List<RelationEntity> findAllByFromIdAndFromTypeAndRelationTypeGroup(UUID fromId,
|
||||||
String fromType,
|
String fromType,
|
||||||
@ -46,20 +48,4 @@ public interface RelationRepository extends CrudRepository<RelationEntity, Relat
|
|||||||
|
|
||||||
List<RelationEntity> findAllByFromIdAndFromType(UUID fromId,
|
List<RelationEntity> findAllByFromIdAndFromType(UUID fromId,
|
||||||
String fromType);
|
String fromType);
|
||||||
|
|
||||||
// @Query(nativeQuery = true, value = "SELECT * FROM RELATION WHERE FROM_ID = :fromId " +
|
|
||||||
// "AND FROM_TYPE = :fromType " +
|
|
||||||
// "AND TO_TYPE = :toType " +
|
|
||||||
// "AND RELATION_TYPE = :relationType " +
|
|
||||||
// "AND RELATION_TYPE_GROUP = :relationTypeGroup " +
|
|
||||||
// "AND ID > :idOffset ORDER BY RELATION_TYPE_GROUP ASC, RELATION_TYPE ASC, TO_TYPE ASC")
|
|
||||||
// List<RelationEntity> findRelations(@Param("fromId") UUID fromId,
|
|
||||||
// @Param("fromType") String fromType,
|
|
||||||
// @Param("toType") String toType,
|
|
||||||
// @Param("relationType") String relationType,
|
|
||||||
// @Param("relationTypeGroup") String relationTypeGroup,
|
|
||||||
// TimePageLink pageLink);
|
|
||||||
|
|
||||||
|
|
||||||
// pageLink, ModelConstants.RELATION_TO_ID_PROPERTY);
|
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user