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