27 changed files with 235 additions and 699 deletions
@ -1,39 +0,0 @@ |
|||||
/** |
|
||||
* Copyright © 2016-2020 The Thingsboard Authors |
|
||||
* |
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
||||
* you may not use this file except in compliance with the License. |
|
||||
* You may obtain a copy of the License at |
|
||||
* |
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||
* |
|
||||
* Unless required by applicable law or agreed to in writing, software |
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
||||
* See the License for the specific language governing permissions and |
|
||||
* limitations under the License. |
|
||||
*/ |
|
||||
package org.thingsboard.server.dao.model.sqlts.hsql; |
|
||||
|
|
||||
import lombok.AllArgsConstructor; |
|
||||
import lombok.Data; |
|
||||
import lombok.NoArgsConstructor; |
|
||||
import org.thingsboard.server.common.data.EntityType; |
|
||||
|
|
||||
import javax.persistence.Transient; |
|
||||
import java.io.Serializable; |
|
||||
import java.util.UUID; |
|
||||
|
|
||||
@Data |
|
||||
@AllArgsConstructor |
|
||||
@NoArgsConstructor |
|
||||
public class TsKvCompositeKey implements Serializable { |
|
||||
|
|
||||
@Transient |
|
||||
private static final long serialVersionUID = -4089175869616037523L; |
|
||||
|
|
||||
private UUID entityId; |
|
||||
private int key; |
|
||||
private long ts; |
|
||||
|
|
||||
} |
|
||||
@ -1,105 +0,0 @@ |
|||||
/** |
|
||||
* Copyright © 2016-2020 The Thingsboard Authors |
|
||||
* |
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
||||
* you may not use this file except in compliance with the License. |
|
||||
* You may obtain a copy of the License at |
|
||||
* |
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||
* |
|
||||
* Unless required by applicable law or agreed to in writing, software |
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
||||
* See the License for the specific language governing permissions and |
|
||||
* limitations under the License. |
|
||||
*/ |
|
||||
package org.thingsboard.server.dao.model.sqlts.hsql; |
|
||||
|
|
||||
import lombok.Data; |
|
||||
import org.thingsboard.server.common.data.kv.TsKvEntry; |
|
||||
import org.thingsboard.server.dao.model.ToData; |
|
||||
import org.thingsboard.server.dao.model.sql.AbstractTsKvEntity; |
|
||||
|
|
||||
import javax.persistence.Column; |
|
||||
import javax.persistence.Entity; |
|
||||
import javax.persistence.Id; |
|
||||
import javax.persistence.IdClass; |
|
||||
import javax.persistence.Table; |
|
||||
|
|
||||
import static org.thingsboard.server.dao.model.ModelConstants.KEY_COLUMN; |
|
||||
|
|
||||
@Data |
|
||||
@Entity |
|
||||
@Table(name = "ts_kv") |
|
||||
@IdClass(TsKvCompositeKey.class) |
|
||||
public final class TsKvEntity extends AbstractTsKvEntity implements ToData<TsKvEntry> { |
|
||||
|
|
||||
@Id |
|
||||
@Column(name = KEY_COLUMN) |
|
||||
private int key; |
|
||||
|
|
||||
public TsKvEntity() { |
|
||||
} |
|
||||
|
|
||||
public TsKvEntity(String strValue) { |
|
||||
this.strValue = strValue; |
|
||||
} |
|
||||
|
|
||||
public TsKvEntity(Long longValue, Double doubleValue, Long longCountValue, Long doubleCountValue, String aggType) { |
|
||||
if (!isAllNull(longValue, doubleValue, longCountValue, doubleCountValue)) { |
|
||||
switch (aggType) { |
|
||||
case AVG: |
|
||||
double sum = 0.0; |
|
||||
if (longValue != null) { |
|
||||
sum += longValue; |
|
||||
} |
|
||||
if (doubleValue != null) { |
|
||||
sum += doubleValue; |
|
||||
} |
|
||||
long totalCount = longCountValue + doubleCountValue; |
|
||||
if (totalCount > 0) { |
|
||||
this.doubleValue = sum / (longCountValue + doubleCountValue); |
|
||||
} else { |
|
||||
this.doubleValue = 0.0; |
|
||||
} |
|
||||
break; |
|
||||
case SUM: |
|
||||
if (doubleCountValue > 0) { |
|
||||
this.doubleValue = doubleValue + (longValue != null ? longValue.doubleValue() : 0.0); |
|
||||
} else { |
|
||||
this.longValue = longValue; |
|
||||
} |
|
||||
break; |
|
||||
case MIN: |
|
||||
case MAX: |
|
||||
if (longCountValue > 0 && doubleCountValue > 0) { |
|
||||
this.doubleValue = MAX.equals(aggType) ? Math.max(doubleValue, longValue.doubleValue()) : Math.min(doubleValue, longValue.doubleValue()); |
|
||||
} else if (doubleCountValue > 0) { |
|
||||
this.doubleValue = doubleValue; |
|
||||
} else if (longCountValue > 0) { |
|
||||
this.longValue = longValue; |
|
||||
} |
|
||||
break; |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
public TsKvEntity(Long booleanValueCount, Long strValueCount, Long longValueCount, Long doubleValueCount, Long jsonValueCount) { |
|
||||
if (!isAllNull(booleanValueCount, strValueCount, longValueCount, doubleValueCount)) { |
|
||||
if (booleanValueCount != 0) { |
|
||||
this.longValue = booleanValueCount; |
|
||||
} else if (strValueCount != 0) { |
|
||||
this.longValue = strValueCount; |
|
||||
} else if (jsonValueCount != 0) { |
|
||||
this.longValue = jsonValueCount; |
|
||||
} else { |
|
||||
this.longValue = longValueCount + doubleValueCount; |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
@Override |
|
||||
public boolean isNotEmpty() { |
|
||||
return strValue != null || longValue != null || doubleValue != null || booleanValue != null; |
|
||||
} |
|
||||
} |
|
||||
@ -1,132 +0,0 @@ |
|||||
/** |
|
||||
* Copyright © 2016-2020 The Thingsboard Authors |
|
||||
* |
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
||||
* you may not use this file except in compliance with the License. |
|
||||
* You may obtain a copy of the License at |
|
||||
* |
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||
* |
|
||||
* Unless required by applicable law or agreed to in writing, software |
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
||||
* See the License for the specific language governing permissions and |
|
||||
* limitations under the License. |
|
||||
*/ |
|
||||
package org.thingsboard.server.dao.sqlts.hsql; |
|
||||
|
|
||||
import org.springframework.data.domain.Pageable; |
|
||||
import org.springframework.data.jpa.repository.Modifying; |
|
||||
import org.springframework.data.jpa.repository.Query; |
|
||||
import org.springframework.data.repository.CrudRepository; |
|
||||
import org.springframework.data.repository.query.Param; |
|
||||
import org.springframework.scheduling.annotation.Async; |
|
||||
import org.springframework.transaction.annotation.Transactional; |
|
||||
import org.thingsboard.server.dao.model.sqlts.hsql.TsKvCompositeKey; |
|
||||
import org.thingsboard.server.dao.model.sqlts.hsql.TsKvEntity; |
|
||||
import org.thingsboard.server.dao.util.SqlDao; |
|
||||
|
|
||||
import java.util.List; |
|
||||
import java.util.UUID; |
|
||||
import java.util.concurrent.CompletableFuture; |
|
||||
|
|
||||
@SqlDao |
|
||||
public interface TsKvHsqlRepository extends CrudRepository<TsKvEntity, TsKvCompositeKey> { |
|
||||
|
|
||||
@Query("SELECT tskv FROM TsKvEntity tskv WHERE tskv.entityId = :entityId " + |
|
||||
"AND tskv.key = :entityKey AND tskv.ts > :startTs AND tskv.ts <= :endTs") |
|
||||
List<TsKvEntity> findAllWithLimit(@Param("entityId") UUID entityId, |
|
||||
@Param("entityKey") int key, |
|
||||
@Param("startTs") long startTs, |
|
||||
@Param("endTs") long endTs, |
|
||||
Pageable pageable); |
|
||||
|
|
||||
@Transactional |
|
||||
@Modifying |
|
||||
@Query("DELETE FROM TsKvEntity tskv WHERE tskv.entityId = :entityId " + |
|
||||
"AND tskv.key = :entityKey AND tskv.ts > :startTs AND tskv.ts <= :endTs") |
|
||||
void delete(@Param("entityId") UUID entityId, |
|
||||
@Param("entityKey") int key, |
|
||||
@Param("startTs") long startTs, |
|
||||
@Param("endTs") long endTs); |
|
||||
|
|
||||
@Async |
|
||||
@Query("SELECT new TsKvEntity(MAX(tskv.strValue)) FROM TsKvEntity tskv " + |
|
||||
"WHERE tskv.strValue IS NOT NULL AND tskv.entityId = :entityId AND tskv.key = :entityKey" + |
|
||||
" AND tskv.ts > :startTs AND tskv.ts <= :endTs") |
|
||||
CompletableFuture<TsKvEntity> findStringMax(@Param("entityId") UUID entityId, |
|
||||
@Param("entityKey") int entityKey, |
|
||||
@Param("startTs") long startTs, |
|
||||
@Param("endTs") long endTs); |
|
||||
|
|
||||
@Async |
|
||||
@Query("SELECT new TsKvEntity(MAX(COALESCE(tskv.longValue, -9223372036854775807)), " + |
|
||||
"MAX(COALESCE(tskv.doubleValue, -1.79769E+308)), " + |
|
||||
"SUM(CASE WHEN tskv.longValue IS NULL THEN 0 ELSE 1 END), " + |
|
||||
"SUM(CASE WHEN tskv.doubleValue IS NULL THEN 0 ELSE 1 END), " + |
|
||||
"'MAX') FROM TsKvEntity tskv WHERE tskv.entityId = :entityId " + |
|
||||
"AND tskv.key = :entityKey AND tskv.ts > :startTs AND tskv.ts <= :endTs") |
|
||||
CompletableFuture<TsKvEntity> findNumericMax(@Param("entityId") UUID entityId, |
|
||||
@Param("entityKey") int entityKey, |
|
||||
@Param("startTs") long startTs, |
|
||||
@Param("endTs") long endTs); |
|
||||
|
|
||||
|
|
||||
@Async |
|
||||
@Query("SELECT new TsKvEntity(MIN(tskv.strValue)) FROM TsKvEntity tskv " + |
|
||||
"WHERE tskv.strValue IS NOT NULL AND tskv.entityId = :entityId " + |
|
||||
"AND tskv.key = :entityKey AND tskv.ts > :startTs AND tskv.ts <= :endTs") |
|
||||
CompletableFuture<TsKvEntity> findStringMin(@Param("entityId") UUID entityId, |
|
||||
@Param("entityKey") int entityKey, |
|
||||
@Param("startTs") long startTs, |
|
||||
@Param("endTs") long endTs); |
|
||||
|
|
||||
@Async |
|
||||
@Query("SELECT new TsKvEntity(MIN(COALESCE(tskv.longValue, 9223372036854775807)), " + |
|
||||
"MIN(COALESCE(tskv.doubleValue, 1.79769E+308)), " + |
|
||||
"SUM(CASE WHEN tskv.longValue IS NULL THEN 0 ELSE 1 END), " + |
|
||||
"SUM(CASE WHEN tskv.doubleValue IS NULL THEN 0 ELSE 1 END), " + |
|
||||
"'MIN') FROM TsKvEntity tskv WHERE tskv.entityId = :entityId " + |
|
||||
"AND tskv.key = :entityKey AND tskv.ts > :startTs AND tskv.ts <= :endTs") |
|
||||
CompletableFuture<TsKvEntity> findNumericMin(@Param("entityId") UUID entityId, |
|
||||
@Param("entityKey") int entityKey, |
|
||||
@Param("startTs") long startTs, |
|
||||
@Param("endTs") long endTs); |
|
||||
|
|
||||
@Async |
|
||||
@Query("SELECT new TsKvEntity(SUM(CASE WHEN tskv.booleanValue IS NULL THEN 0 ELSE 1 END), " + |
|
||||
"SUM(CASE WHEN tskv.strValue IS NULL THEN 0 ELSE 1 END), " + |
|
||||
"SUM(CASE WHEN tskv.longValue IS NULL THEN 0 ELSE 1 END), " + |
|
||||
"SUM(CASE WHEN tskv.doubleValue IS NULL THEN 0 ELSE 1 END), " + |
|
||||
"SUM(CASE WHEN tskv.jsonValue IS NULL THEN 0 ELSE 1 END)) FROM TsKvEntity tskv " + |
|
||||
"WHERE tskv.entityId = :entityId AND tskv.key = :entityKey AND tskv.ts > :startTs AND tskv.ts <= :endTs") |
|
||||
CompletableFuture<TsKvEntity> findCount(@Param("entityId") UUID entityId, |
|
||||
@Param("entityKey") int entityKey, |
|
||||
@Param("startTs") long startTs, |
|
||||
@Param("endTs") long endTs); |
|
||||
|
|
||||
@Async |
|
||||
@Query("SELECT new TsKvEntity(SUM(COALESCE(tskv.longValue, 0)), " + |
|
||||
"SUM(COALESCE(tskv.doubleValue, 0.0)), " + |
|
||||
"SUM(CASE WHEN tskv.longValue IS NULL THEN 0 ELSE 1 END), " + |
|
||||
"SUM(CASE WHEN tskv.doubleValue IS NULL THEN 0 ELSE 1 END), " + |
|
||||
"'AVG') FROM TsKvEntity tskv WHERE tskv.entityId = :entityId " + |
|
||||
"AND tskv.key = :entityKey AND tskv.ts > :startTs AND tskv.ts <= :endTs") |
|
||||
CompletableFuture<TsKvEntity> findAvg(@Param("entityId") UUID entityId, |
|
||||
@Param("entityKey") int entityKey, |
|
||||
@Param("startTs") long startTs, |
|
||||
@Param("endTs") long endTs); |
|
||||
|
|
||||
@Async |
|
||||
@Query("SELECT new TsKvEntity(SUM(COALESCE(tskv.longValue, 0)), " + |
|
||||
"SUM(COALESCE(tskv.doubleValue, 0.0)), " + |
|
||||
"SUM(CASE WHEN tskv.longValue IS NULL THEN 0 ELSE 1 END), " + |
|
||||
"SUM(CASE WHEN tskv.doubleValue IS NULL THEN 0 ELSE 1 END), " + |
|
||||
"'SUM') FROM TsKvEntity tskv WHERE tskv.entityId = :entityId " + |
|
||||
"AND tskv.key = :entityKey AND tskv.ts > :startTs AND tskv.ts <= :endTs") |
|
||||
CompletableFuture<TsKvEntity> findSum(@Param("entityId") UUID entityId, |
|
||||
@Param("entityKey") int entityKey, |
|
||||
@Param("startTs") long startTs, |
|
||||
@Param("endTs") long endTs); |
|
||||
|
|
||||
} |
|
||||
Loading…
Reference in new issue