Added get ts async implementation
This commit is contained in:
parent
6206d5fcb2
commit
5935de07b3
@ -16,6 +16,7 @@
|
||||
package org.thingsboard.server.dao.model.sql;
|
||||
|
||||
import lombok.Data;
|
||||
import org.thingsboard.server.common.data.EntityType;
|
||||
import org.thingsboard.server.common.data.kv.*;
|
||||
import org.thingsboard.server.dao.model.ToData;
|
||||
|
||||
@ -32,8 +33,9 @@ import static org.thingsboard.server.dao.model.ModelConstants.*;
|
||||
public class AttributeKvEntity implements ToData<AttributeKvEntry>, Serializable {
|
||||
|
||||
@Id
|
||||
@Enumerated(EnumType.STRING)
|
||||
@Column(name = ENTITY_TYPE_COLUMN)
|
||||
private String entityType;
|
||||
private EntityType entityType;
|
||||
|
||||
@Id
|
||||
@Column(name = ENTITY_ID_COLUMN)
|
||||
|
||||
@ -18,6 +18,7 @@ package org.thingsboard.server.dao.model.sql;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
import org.thingsboard.server.common.data.EntityType;
|
||||
|
||||
import javax.persistence.Transient;
|
||||
import java.io.Serializable;
|
||||
@ -31,7 +32,7 @@ public class TsKvCompositeKey implements Serializable{
|
||||
@Transient
|
||||
private static final long serialVersionUID = -4089175869616037523L;
|
||||
|
||||
private String entityType;
|
||||
private EntityType entityType;
|
||||
private UUID entityId;
|
||||
private String key;
|
||||
private long ts;
|
||||
|
||||
@ -16,7 +16,8 @@
|
||||
package org.thingsboard.server.dao.model.sql;
|
||||
|
||||
import lombok.Data;
|
||||
import org.thingsboard.server.common.data.kv.TsKvEntry;
|
||||
import org.thingsboard.server.common.data.EntityType;
|
||||
import org.thingsboard.server.common.data.kv.*;
|
||||
import org.thingsboard.server.dao.model.ToData;
|
||||
|
||||
import javax.persistence.*;
|
||||
@ -30,9 +31,41 @@ import static org.thingsboard.server.dao.model.ModelConstants.*;
|
||||
@IdClass(TsKvCompositeKey.class)
|
||||
public final class TsKvEntity implements ToData<TsKvEntry> {
|
||||
|
||||
public TsKvEntity() {
|
||||
}
|
||||
|
||||
public TsKvEntity(Double avgLongValue, Double avgDoubleValue) {
|
||||
this.longValue = avgLongValue.longValue();
|
||||
this.doubleValue = avgDoubleValue;
|
||||
}
|
||||
|
||||
public TsKvEntity(Long sumLongValue, Double sumDoubleValue) {
|
||||
this.longValue = sumLongValue;
|
||||
this.doubleValue = sumDoubleValue;
|
||||
}
|
||||
|
||||
public TsKvEntity(String strValue, Long longValue, Double doubleValue) {
|
||||
this.strValue = strValue;
|
||||
this.longValue = longValue;
|
||||
this.doubleValue = doubleValue;
|
||||
}
|
||||
|
||||
public TsKvEntity(Long booleanValueCount, Long strValueCount, Long longValueCount, Long doubleValueCount) {
|
||||
if (booleanValueCount != 0) {
|
||||
this.longValue = booleanValueCount;
|
||||
} else if (strValueCount != 0) {
|
||||
this.longValue = strValueCount;
|
||||
} else if (longValueCount != 0) {
|
||||
this.longValue = longValueCount;
|
||||
} else if (doubleValueCount != 0) {
|
||||
this.longValue = doubleValueCount;
|
||||
}
|
||||
}
|
||||
|
||||
@Id
|
||||
@Enumerated(EnumType.STRING)
|
||||
@Column(name = ENTITY_TYPE_COLUMN)
|
||||
private String entityType;
|
||||
private EntityType entityType;
|
||||
|
||||
@Id
|
||||
@Column(name = ENTITY_ID_COLUMN)
|
||||
@ -60,6 +93,16 @@ public final class TsKvEntity implements ToData<TsKvEntry> {
|
||||
|
||||
@Override
|
||||
public TsKvEntry toData() {
|
||||
return null;
|
||||
KvEntry kvEntry = null;
|
||||
if (strValue != null) {
|
||||
kvEntry = new StringDataEntry(key, strValue);
|
||||
} else if (longValue != null) {
|
||||
kvEntry = new LongDataEntry(key, longValue);
|
||||
} else if (doubleValue != null) {
|
||||
kvEntry = new DoubleDataEntry(key, doubleValue);
|
||||
} else if (booleanValue != null) {
|
||||
kvEntry = new BooleanDataEntry(key, booleanValue);
|
||||
}
|
||||
return new BasicTsKvEntry(ts, kvEntry);
|
||||
}
|
||||
}
|
||||
|
||||
@ -16,6 +16,7 @@
|
||||
package org.thingsboard.server.dao.model.sql;
|
||||
|
||||
import lombok.*;
|
||||
import org.thingsboard.server.common.data.EntityType;
|
||||
|
||||
import javax.persistence.Transient;
|
||||
import java.io.Serializable;
|
||||
@ -29,7 +30,7 @@ public class TsKvLatestCompositeKey implements Serializable{
|
||||
@Transient
|
||||
private static final long serialVersionUID = -4089175869616037523L;
|
||||
|
||||
private String entityType;
|
||||
private EntityType entityType;
|
||||
private UUID entityId;
|
||||
private String key;
|
||||
}
|
||||
@ -16,6 +16,7 @@
|
||||
package org.thingsboard.server.dao.model.sql;
|
||||
|
||||
import lombok.Data;
|
||||
import org.thingsboard.server.common.data.EntityType;
|
||||
import org.thingsboard.server.common.data.kv.*;
|
||||
import org.thingsboard.server.dao.model.ToData;
|
||||
|
||||
@ -31,8 +32,9 @@ import static org.thingsboard.server.dao.model.ModelConstants.*;
|
||||
public final class TsKvLatestEntity implements ToData<TsKvEntry> {
|
||||
|
||||
@Id
|
||||
@Enumerated(EnumType.STRING)
|
||||
@Column(name = ENTITY_TYPE_COLUMN)
|
||||
private String entityType;
|
||||
private EntityType entityType;
|
||||
|
||||
@Id
|
||||
@Column(name = ENTITY_ID_COLUMN)
|
||||
|
||||
@ -83,7 +83,7 @@ public class JpaAttributeDao extends JpaAbstractDaoListeningExecutorService impl
|
||||
@Override
|
||||
public ListenableFuture<Void> save(EntityId entityId, String attributeType, AttributeKvEntry attribute) {
|
||||
AttributeKvEntity entity = new AttributeKvEntity();
|
||||
entity.setEntityType(entityId.getEntityType().name());
|
||||
entity.setEntityType(entityId.getEntityType());
|
||||
entity.setEntityId(entityId.getId());
|
||||
entity.setAttributeType(attributeType);
|
||||
entity.setAttributeKey(attribute.getKey());
|
||||
@ -104,7 +104,7 @@ public class JpaAttributeDao extends JpaAbstractDaoListeningExecutorService impl
|
||||
.stream()
|
||||
.map(key -> {
|
||||
AttributeKvEntity entityToDelete = new AttributeKvEntity();
|
||||
entityToDelete.setEntityType(entityId.getEntityType().name());
|
||||
entityToDelete.setEntityType(entityId.getEntityType());
|
||||
entityToDelete.setEntityId(entityId.getId());
|
||||
entityToDelete.setAttributeType(attributeType);
|
||||
entityToDelete.setAttributeKey(key);
|
||||
|
||||
@ -21,6 +21,7 @@ import com.google.common.util.concurrent.Futures;
|
||||
import com.google.common.util.concurrent.ListenableFuture;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.data.domain.PageRequest;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.thingsboard.server.common.data.id.EntityId;
|
||||
import org.thingsboard.server.common.data.kv.Aggregation;
|
||||
@ -35,6 +36,7 @@ import org.thingsboard.server.dao.sql.JpaAbstractDaoListeningExecutorService;
|
||||
import org.thingsboard.server.dao.timeseries.TimeseriesDao;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@ -73,19 +75,93 @@ public class JpaTimeseriesDao extends JpaAbstractDaoListeningExecutorService imp
|
||||
if (query.getAggregation() == Aggregation.NONE) {
|
||||
return findAllAsyncWithLimit(entityId, query);
|
||||
} else {
|
||||
return service.submit(() -> null);
|
||||
long stepTs = query.getStartTs();
|
||||
List<ListenableFuture<TsKvEntry>> futures = new ArrayList<>();
|
||||
while (stepTs < query.getEndTs()) {
|
||||
long startTs = stepTs;
|
||||
long endTs = stepTs + query.getInterval();
|
||||
long ts = startTs + (endTs - startTs) / 2;
|
||||
futures.add(findAndAggregateAsync(entityId, query.getKey(), startTs, endTs, ts, query.getAggregation()));
|
||||
stepTs = endTs;
|
||||
}
|
||||
return Futures.allAsList(futures);
|
||||
}
|
||||
}
|
||||
|
||||
private ListenableFuture<TsKvEntry> findAndAggregateAsync(EntityId entityId, String key, long startTs, long endTs, long ts, Aggregation aggregation) {
|
||||
TsKvEntity entity;
|
||||
switch (aggregation) {
|
||||
case AVG:
|
||||
entity = tsKvRepository.findAvg(
|
||||
entityId.getId(),
|
||||
entityId.getEntityType(),
|
||||
key,
|
||||
startTs,
|
||||
endTs);
|
||||
|
||||
break;
|
||||
case MAX:
|
||||
entity = tsKvRepository.findMax(
|
||||
entityId.getId(),
|
||||
entityId.getEntityType(),
|
||||
key,
|
||||
startTs,
|
||||
endTs);
|
||||
|
||||
break;
|
||||
case MIN:
|
||||
entity = tsKvRepository.findMin(
|
||||
entityId.getId(),
|
||||
entityId.getEntityType(),
|
||||
key,
|
||||
startTs,
|
||||
endTs);
|
||||
|
||||
break;
|
||||
case SUM:
|
||||
entity = tsKvRepository.findSum(
|
||||
entityId.getId(),
|
||||
entityId.getEntityType(),
|
||||
key,
|
||||
startTs,
|
||||
endTs);
|
||||
|
||||
break;
|
||||
case COUNT:
|
||||
entity = tsKvRepository.findCount(
|
||||
entityId.getId(),
|
||||
entityId.getEntityType(),
|
||||
key,
|
||||
startTs,
|
||||
endTs);
|
||||
|
||||
break;
|
||||
default:
|
||||
entity = null;
|
||||
}
|
||||
if (entity != null){
|
||||
entity.setTs(ts);
|
||||
}
|
||||
return service.submit(() -> DaoUtil.getData(entity));
|
||||
}
|
||||
|
||||
private ListenableFuture<List<TsKvEntry>> findAllAsyncWithLimit(EntityId entityId, TsKvQuery query) {
|
||||
return service.submit(() -> null);
|
||||
return service.submit(() ->
|
||||
DaoUtil.convertDataList(
|
||||
tsKvRepository.findAllWithLimit(
|
||||
entityId.getId(),
|
||||
entityId.getEntityType(),
|
||||
query.getKey(),
|
||||
query.getStartTs(),
|
||||
query.getEndTs(),
|
||||
new PageRequest(0, query.getLimit()))));
|
||||
}
|
||||
|
||||
@Override
|
||||
public ListenableFuture<TsKvEntry> findLatest(EntityId entityId, String key) {
|
||||
TsKvLatestCompositeKey compositeKey =
|
||||
new TsKvLatestCompositeKey(
|
||||
entityId.getEntityType().name(),
|
||||
entityId.getEntityType(),
|
||||
entityId.getId(),
|
||||
key);
|
||||
return service.submit(() ->
|
||||
@ -104,7 +180,7 @@ public class JpaTimeseriesDao extends JpaAbstractDaoListeningExecutorService imp
|
||||
@Override
|
||||
public ListenableFuture<Void> save(EntityId entityId, TsKvEntry tsKvEntry, long ttl) {
|
||||
TsKvEntity entity = new TsKvEntity();
|
||||
entity.setEntityType(entityId.getEntityType().name());
|
||||
entity.setEntityType(entityId.getEntityType());
|
||||
entity.setEntityId(entityId.getId());
|
||||
entity.setTs(tsKvEntry.getTs());
|
||||
entity.setKey(tsKvEntry.getKey());
|
||||
@ -126,7 +202,7 @@ public class JpaTimeseriesDao extends JpaAbstractDaoListeningExecutorService imp
|
||||
@Override
|
||||
public ListenableFuture<Void> saveLatest(EntityId entityId, TsKvEntry tsKvEntry) {
|
||||
TsKvLatestEntity latestEntity = new TsKvLatestEntity();
|
||||
latestEntity.setEntityType(entityId.getEntityType().name());
|
||||
latestEntity.setEntityType(entityId.getEntityType());
|
||||
latestEntity.setEntityId(entityId.getId());
|
||||
latestEntity.setTs(tsKvEntry.getTs());
|
||||
latestEntity.setKey(tsKvEntry.getKey());
|
||||
|
||||
@ -15,11 +15,76 @@
|
||||
*/
|
||||
package org.thingsboard.server.dao.sql.timeseries;
|
||||
|
||||
import org.springframework.data.domain.Pageable;
|
||||
import org.springframework.data.jpa.repository.Query;
|
||||
import org.springframework.data.repository.CrudRepository;
|
||||
import org.springframework.data.repository.query.Param;
|
||||
import org.thingsboard.server.common.data.EntityType;
|
||||
import org.thingsboard.server.dao.annotation.SqlDao;
|
||||
import org.thingsboard.server.dao.model.sql.TsKvCompositeKey;
|
||||
import org.thingsboard.server.dao.model.sql.TsKvEntity;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
@SqlDao
|
||||
public interface TsKvRepository extends CrudRepository<TsKvEntity, TsKvCompositeKey> {
|
||||
|
||||
@Query("SELECT tskv FROM TsKvEntity tskv WHERE tskv.entityId = :entityId " +
|
||||
"AND tskv.entityType = :entityType AND tskv.key = :entityKey " +
|
||||
"AND tskv.ts > :startTs AND tskv.ts < :endTs ORDER BY tskv.ts DESC")
|
||||
List<TsKvEntity> findAllWithLimit(@Param("entityId") UUID entityId,
|
||||
@Param("entityType") EntityType entityType,
|
||||
@Param("entityKey") String key,
|
||||
@Param("startTs") long startTs,
|
||||
@Param("endTs") long endTs,
|
||||
Pageable pageable);
|
||||
|
||||
@Query("SELECT new TsKvEntity(MAX(tskv.strValue), MAX(tskv.longValue), MAX(tskv.doubleValue)) FROM TsKvEntity tskv " +
|
||||
"WHERE tskv.entityId = :entityId AND tskv.entityType = :entityType " +
|
||||
"AND tskv.key = :entityKey AND tskv.ts > :startTs AND tskv.ts < :endTs")
|
||||
TsKvEntity findMax(@Param("entityId") UUID entityId,
|
||||
@Param("entityType") EntityType entityType,
|
||||
@Param("entityKey") String entityKey,
|
||||
@Param("startTs") long startTs,
|
||||
@Param("endTs") long endTs);
|
||||
|
||||
@Query("SELECT new TsKvEntity(MIN(tskv.strValue), MIN(tskv.longValue), MIN(tskv.doubleValue)) FROM TsKvEntity tskv " +
|
||||
"WHERE tskv.entityId = :entityId AND tskv.entityType = :entityType " +
|
||||
"AND tskv.key = :entityKey AND tskv.ts > :startTs AND tskv.ts < :endTs")
|
||||
TsKvEntity findMin(@Param("entityId") UUID entityId,
|
||||
@Param("entityType") EntityType entityType,
|
||||
@Param("entityKey") String entityKey,
|
||||
@Param("startTs") long startTs,
|
||||
@Param("endTs") long endTs);
|
||||
|
||||
|
||||
@Query("SELECT new TsKvEntity(COUNT(tskv.booleanValue), COUNT(tskv.strValue), COUNT(tskv.longValue), COUNT(tskv.doubleValue)) FROM TsKvEntity tskv " +
|
||||
"WHERE tskv.entityId = :entityId AND tskv.entityType = :entityType " +
|
||||
"AND tskv.key = :entityKey AND tskv.ts > :startTs AND tskv.ts < :endTs")
|
||||
TsKvEntity findCount(@Param("entityId") UUID entityId,
|
||||
@Param("entityType") EntityType entityType,
|
||||
@Param("entityKey") String entityKey,
|
||||
@Param("startTs") long startTs,
|
||||
@Param("endTs") long endTs);
|
||||
|
||||
|
||||
@Query("SELECT new TsKvEntity(AVG(tskv.longValue), AVG(tskv.doubleValue)) FROM TsKvEntity tskv " +
|
||||
"WHERE tskv.entityId = :entityId AND tskv.entityType = :entityType " +
|
||||
"AND tskv.key = :entityKey AND tskv.ts > :startTs AND tskv.ts < :endTs")
|
||||
TsKvEntity findAvg(@Param("entityId") UUID entityId,
|
||||
@Param("entityType") EntityType entityType,
|
||||
@Param("entityKey") String entityKey,
|
||||
@Param("startTs") long startTs,
|
||||
@Param("endTs") long endTs);
|
||||
|
||||
|
||||
@Query("SELECT new TsKvEntity(SUM(tskv.longValue), SUM(tskv.doubleValue)) FROM TsKvEntity tskv " +
|
||||
"WHERE tskv.entityId = :entityId AND tskv.entityType = :entityType " +
|
||||
"AND tskv.key = :entityKey AND tskv.ts > :startTs AND tskv.ts < :endTs")
|
||||
TsKvEntity findSum(@Param("entityId") UUID entityId,
|
||||
@Param("entityType") EntityType entityType,
|
||||
@Param("entityKey") String entityKey,
|
||||
@Param("startTs") long startTs,
|
||||
@Param("endTs") long endTs);
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user