Showing
16 changed files
with
241 additions
and
141 deletions
@@ -28,13 +28,7 @@ import org.springframework.http.HttpStatus; | @@ -28,13 +28,7 @@ import org.springframework.http.HttpStatus; | ||
28 | import org.springframework.http.ResponseEntity; | 28 | import org.springframework.http.ResponseEntity; |
29 | import org.springframework.security.access.prepost.PreAuthorize; | 29 | import org.springframework.security.access.prepost.PreAuthorize; |
30 | import org.springframework.util.StringUtils; | 30 | import org.springframework.util.StringUtils; |
31 | -import org.springframework.web.bind.annotation.PathVariable; | ||
32 | -import org.springframework.web.bind.annotation.RequestBody; | ||
33 | -import org.springframework.web.bind.annotation.RequestMapping; | ||
34 | -import org.springframework.web.bind.annotation.RequestMethod; | ||
35 | -import org.springframework.web.bind.annotation.RequestParam; | ||
36 | -import org.springframework.web.bind.annotation.ResponseBody; | ||
37 | -import org.springframework.web.bind.annotation.RestController; | 31 | +import org.springframework.web.bind.annotation.*; |
38 | import org.springframework.web.context.request.async.DeferredResult; | 32 | import org.springframework.web.context.request.async.DeferredResult; |
39 | import org.thingsboard.rule.engine.api.msg.DeviceAttributesEventNotificationMsg; | 33 | import org.thingsboard.rule.engine.api.msg.DeviceAttributesEventNotificationMsg; |
40 | import org.thingsboard.server.common.data.DataConstants; | 34 | import org.thingsboard.server.common.data.DataConstants; |
@@ -45,19 +39,7 @@ import org.thingsboard.server.common.data.id.DeviceId; | @@ -45,19 +39,7 @@ import org.thingsboard.server.common.data.id.DeviceId; | ||
45 | import org.thingsboard.server.common.data.id.EntityId; | 39 | import org.thingsboard.server.common.data.id.EntityId; |
46 | import org.thingsboard.server.common.data.id.EntityIdFactory; | 40 | import org.thingsboard.server.common.data.id.EntityIdFactory; |
47 | import org.thingsboard.server.common.data.id.UUIDBased; | 41 | import org.thingsboard.server.common.data.id.UUIDBased; |
48 | -import org.thingsboard.server.common.data.kv.Aggregation; | ||
49 | -import org.thingsboard.server.common.data.kv.AttributeKey; | ||
50 | -import org.thingsboard.server.common.data.kv.AttributeKvEntry; | ||
51 | -import org.thingsboard.server.common.data.kv.BaseAttributeKvEntry; | ||
52 | -import org.thingsboard.server.common.data.kv.BaseTsKvQuery; | ||
53 | -import org.thingsboard.server.common.data.kv.BasicTsKvEntry; | ||
54 | -import org.thingsboard.server.common.data.kv.BooleanDataEntry; | ||
55 | -import org.thingsboard.server.common.data.kv.DoubleDataEntry; | ||
56 | -import org.thingsboard.server.common.data.kv.KvEntry; | ||
57 | -import org.thingsboard.server.common.data.kv.LongDataEntry; | ||
58 | -import org.thingsboard.server.common.data.kv.StringDataEntry; | ||
59 | -import org.thingsboard.server.common.data.kv.TsKvEntry; | ||
60 | -import org.thingsboard.server.common.data.kv.TsKvQuery; | 42 | +import org.thingsboard.server.common.data.kv.*; |
61 | import org.thingsboard.server.common.msg.cluster.SendToClusterMsg; | 43 | import org.thingsboard.server.common.msg.cluster.SendToClusterMsg; |
62 | import org.thingsboard.server.common.msg.core.TelemetryUploadRequest; | 44 | import org.thingsboard.server.common.msg.core.TelemetryUploadRequest; |
63 | import org.thingsboard.server.common.transport.adaptor.JsonConverter; | 45 | import org.thingsboard.server.common.transport.adaptor.JsonConverter; |
@@ -74,14 +56,7 @@ import org.thingsboard.server.service.telemetry.exception.UncheckedApiException; | @@ -74,14 +56,7 @@ import org.thingsboard.server.service.telemetry.exception.UncheckedApiException; | ||
74 | import javax.annotation.Nullable; | 56 | import javax.annotation.Nullable; |
75 | import javax.annotation.PostConstruct; | 57 | import javax.annotation.PostConstruct; |
76 | import javax.annotation.PreDestroy; | 58 | import javax.annotation.PreDestroy; |
77 | -import java.util.ArrayList; | ||
78 | -import java.util.Arrays; | ||
79 | -import java.util.HashSet; | ||
80 | -import java.util.LinkedHashMap; | ||
81 | -import java.util.List; | ||
82 | -import java.util.Map; | ||
83 | -import java.util.Set; | ||
84 | -import java.util.UUID; | 59 | +import java.util.*; |
85 | import java.util.concurrent.ExecutorService; | 60 | import java.util.concurrent.ExecutorService; |
86 | import java.util.concurrent.Executors; | 61 | import java.util.concurrent.Executors; |
87 | import java.util.stream.Collectors; | 62 | import java.util.stream.Collectors; |
@@ -201,7 +176,7 @@ public class TelemetryController extends BaseController { | @@ -201,7 +176,7 @@ public class TelemetryController extends BaseController { | ||
201 | (result, entityId) -> { | 176 | (result, entityId) -> { |
202 | // If interval is 0, convert this to a NONE aggregation, which is probably what the user really wanted | 177 | // If interval is 0, convert this to a NONE aggregation, which is probably what the user really wanted |
203 | Aggregation agg = interval == 0L ? Aggregation.valueOf(Aggregation.NONE.name()) : Aggregation.valueOf(aggStr); | 178 | Aggregation agg = interval == 0L ? Aggregation.valueOf(Aggregation.NONE.name()) : Aggregation.valueOf(aggStr); |
204 | - List<TsKvQuery> queries = toKeysList(keys).stream().map(key -> new BaseTsKvQuery(key, startTs, endTs, interval, limit, agg, "DESC", false)) | 179 | + List<TsKvQuery> queries = toKeysList(keys).stream().map(key -> new BaseTsKvQuery(key, startTs, endTs, interval, limit, agg, "DESC")) |
205 | .collect(Collectors.toList()); | 180 | .collect(Collectors.toList()); |
206 | 181 | ||
207 | Futures.addCallback(tsService.findAll(entityId, queries), getTsKvListCallback(result)); | 182 | Futures.addCallback(tsService.findAll(entityId, queries), getTsKvListCallback(result)); |
@@ -28,22 +28,12 @@ import org.springframework.util.StringUtils; | @@ -28,22 +28,12 @@ import org.springframework.util.StringUtils; | ||
28 | import org.thingsboard.server.common.data.DataConstants; | 28 | import org.thingsboard.server.common.data.DataConstants; |
29 | import org.thingsboard.server.common.data.id.EntityId; | 29 | import org.thingsboard.server.common.data.id.EntityId; |
30 | import org.thingsboard.server.common.data.id.EntityIdFactory; | 30 | import org.thingsboard.server.common.data.id.EntityIdFactory; |
31 | -import org.thingsboard.server.common.data.kv.Aggregation; | ||
32 | -import org.thingsboard.server.common.data.kv.AttributeKvEntry; | ||
33 | -import org.thingsboard.server.common.data.kv.BaseTsKvQuery; | ||
34 | -import org.thingsboard.server.common.data.kv.BasicTsKvEntry; | ||
35 | -import org.thingsboard.server.common.data.kv.TsKvEntry; | ||
36 | -import org.thingsboard.server.common.data.kv.TsKvQuery; | 31 | +import org.thingsboard.server.common.data.kv.*; |
37 | import org.thingsboard.server.dao.attributes.AttributesService; | 32 | import org.thingsboard.server.dao.attributes.AttributesService; |
38 | import org.thingsboard.server.dao.timeseries.TimeseriesService; | 33 | import org.thingsboard.server.dao.timeseries.TimeseriesService; |
39 | import org.thingsboard.server.service.security.AccessValidator; | 34 | import org.thingsboard.server.service.security.AccessValidator; |
40 | import org.thingsboard.server.service.security.ValidationResult; | 35 | import org.thingsboard.server.service.security.ValidationResult; |
41 | -import org.thingsboard.server.service.telemetry.cmd.AttributesSubscriptionCmd; | ||
42 | -import org.thingsboard.server.service.telemetry.cmd.GetHistoryCmd; | ||
43 | -import org.thingsboard.server.service.telemetry.cmd.SubscriptionCmd; | ||
44 | -import org.thingsboard.server.service.telemetry.cmd.TelemetryPluginCmd; | ||
45 | -import org.thingsboard.server.service.telemetry.cmd.TelemetryPluginCmdsWrapper; | ||
46 | -import org.thingsboard.server.service.telemetry.cmd.TimeseriesSubscriptionCmd; | 36 | +import org.thingsboard.server.service.telemetry.cmd.*; |
47 | import org.thingsboard.server.service.telemetry.exception.UnauthorizedException; | 37 | import org.thingsboard.server.service.telemetry.exception.UnauthorizedException; |
48 | import org.thingsboard.server.service.telemetry.sub.SubscriptionErrorCode; | 38 | import org.thingsboard.server.service.telemetry.sub.SubscriptionErrorCode; |
49 | import org.thingsboard.server.service.telemetry.sub.SubscriptionState; | 39 | import org.thingsboard.server.service.telemetry.sub.SubscriptionState; |
@@ -53,14 +43,7 @@ import javax.annotation.Nullable; | @@ -53,14 +43,7 @@ import javax.annotation.Nullable; | ||
53 | import javax.annotation.PostConstruct; | 43 | import javax.annotation.PostConstruct; |
54 | import javax.annotation.PreDestroy; | 44 | import javax.annotation.PreDestroy; |
55 | import java.io.IOException; | 45 | import java.io.IOException; |
56 | -import java.util.ArrayList; | ||
57 | -import java.util.Collections; | ||
58 | -import java.util.HashMap; | ||
59 | -import java.util.HashSet; | ||
60 | -import java.util.List; | ||
61 | -import java.util.Map; | ||
62 | -import java.util.Optional; | ||
63 | -import java.util.Set; | 46 | +import java.util.*; |
64 | import java.util.concurrent.ConcurrentHashMap; | 47 | import java.util.concurrent.ConcurrentHashMap; |
65 | import java.util.concurrent.ConcurrentMap; | 48 | import java.util.concurrent.ConcurrentMap; |
66 | import java.util.concurrent.ExecutorService; | 49 | import java.util.concurrent.ExecutorService; |
@@ -251,7 +234,7 @@ public class DefaultTelemetryWebSocketService implements TelemetryWebSocketServi | @@ -251,7 +234,7 @@ public class DefaultTelemetryWebSocketService implements TelemetryWebSocketServi | ||
251 | } | 234 | } |
252 | EntityId entityId = EntityIdFactory.getByTypeAndId(cmd.getEntityType(), cmd.getEntityId()); | 235 | EntityId entityId = EntityIdFactory.getByTypeAndId(cmd.getEntityType(), cmd.getEntityId()); |
253 | List<String> keys = new ArrayList<>(getKeys(cmd).orElse(Collections.emptySet())); | 236 | List<String> keys = new ArrayList<>(getKeys(cmd).orElse(Collections.emptySet())); |
254 | - List<TsKvQuery> queries = keys.stream().map(key -> new BaseTsKvQuery(key, cmd.getStartTs(), cmd.getEndTs(), cmd.getInterval(), getLimit(cmd.getLimit()), getAggregation(cmd.getAgg()), "DESC", false)) | 237 | + List<TsKvQuery> queries = keys.stream().map(key -> new BaseTsKvQuery(key, cmd.getStartTs(), cmd.getEndTs(), cmd.getInterval(), getLimit(cmd.getLimit()), getAggregation(cmd.getAgg()), "DESC")) |
255 | .collect(Collectors.toList()); | 238 | .collect(Collectors.toList()); |
256 | 239 | ||
257 | FutureCallback<List<TsKvEntry>> callback = new FutureCallback<List<TsKvEntry>>() { | 240 | FutureCallback<List<TsKvEntry>> callback = new FutureCallback<List<TsKvEntry>>() { |
@@ -338,7 +321,7 @@ public class DefaultTelemetryWebSocketService implements TelemetryWebSocketServi | @@ -338,7 +321,7 @@ public class DefaultTelemetryWebSocketService implements TelemetryWebSocketServi | ||
338 | startTs = cmd.getStartTs(); | 321 | startTs = cmd.getStartTs(); |
339 | long endTs = cmd.getStartTs() + cmd.getTimeWindow(); | 322 | long endTs = cmd.getStartTs() + cmd.getTimeWindow(); |
340 | List<TsKvQuery> queries = keys.stream().map(key -> new BaseTsKvQuery(key, startTs, endTs, cmd.getInterval(), | 323 | List<TsKvQuery> queries = keys.stream().map(key -> new BaseTsKvQuery(key, startTs, endTs, cmd.getInterval(), |
341 | - getLimit(cmd.getLimit()), getAggregation(cmd.getAgg()), "DESC", false)).collect(Collectors.toList()); | 324 | + getLimit(cmd.getLimit()), getAggregation(cmd.getAgg()), "DESC")).collect(Collectors.toList()); |
342 | 325 | ||
343 | final FutureCallback<List<TsKvEntry>> callback = getSubscriptionCallback(sessionRef, cmd, sessionId, entityId, startTs, keys); | 326 | final FutureCallback<List<TsKvEntry>> callback = getSubscriptionCallback(sessionRef, cmd, sessionId, entityId, startTs, keys); |
344 | accessValidator.validate(sessionRef.getSecurityCtx(), entityId, | 327 | accessValidator.validate(sessionRef.getSecurityCtx(), entityId, |
1 | +/** | ||
2 | + * Copyright © 2016-2018 The Thingsboard Authors | ||
3 | + * | ||
4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | + * you may not use this file except in compliance with the License. | ||
6 | + * You may obtain a copy of the License at | ||
7 | + * | ||
8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | + * | ||
10 | + * Unless required by applicable law or agreed to in writing, software | ||
11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | + * See the License for the specific language governing permissions and | ||
14 | + * limitations under the License. | ||
15 | + */ | ||
16 | +package org.thingsboard.server.common.data.kv; | ||
17 | + | ||
18 | +import lombok.Data; | ||
19 | + | ||
20 | +@Data | ||
21 | +public class BaseDeleteTsKvQuery extends BaseQuery implements DeleteTsKvQuery { | ||
22 | + | ||
23 | + private final Boolean rewriteLatestIfDeleted; | ||
24 | + | ||
25 | + public BaseDeleteTsKvQuery(String key, long startTs, long endTs, boolean rewriteLatestIfDeleted) { | ||
26 | + super(key, startTs, endTs); | ||
27 | + this.rewriteLatestIfDeleted = rewriteLatestIfDeleted; | ||
28 | + } | ||
29 | + | ||
30 | + public BaseDeleteTsKvQuery(String key, long startTs, long endTs) { | ||
31 | + this(key, startTs, endTs, false); | ||
32 | + } | ||
33 | + | ||
34 | + | ||
35 | +} |
1 | +/** | ||
2 | + * Copyright © 2016-2018 The Thingsboard Authors | ||
3 | + * | ||
4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | + * you may not use this file except in compliance with the License. | ||
6 | + * You may obtain a copy of the License at | ||
7 | + * | ||
8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | + * | ||
10 | + * Unless required by applicable law or agreed to in writing, software | ||
11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | + * See the License for the specific language governing permissions and | ||
14 | + * limitations under the License. | ||
15 | + */ | ||
16 | +package org.thingsboard.server.common.data.kv; | ||
17 | + | ||
18 | +import lombok.Data; | ||
19 | + | ||
20 | +@Data | ||
21 | +public class BaseQuery implements Query { | ||
22 | + | ||
23 | + private final String key; | ||
24 | + private final long startTs; | ||
25 | + private final long endTs; | ||
26 | + | ||
27 | + public BaseQuery(String key, long startTs, long endTs) { | ||
28 | + this.key = key; | ||
29 | + this.startTs = startTs; | ||
30 | + this.endTs = endTs; | ||
31 | + } | ||
32 | + | ||
33 | +} |
@@ -18,31 +18,24 @@ package org.thingsboard.server.common.data.kv; | @@ -18,31 +18,24 @@ package org.thingsboard.server.common.data.kv; | ||
18 | import lombok.Data; | 18 | import lombok.Data; |
19 | 19 | ||
20 | @Data | 20 | @Data |
21 | -public class BaseTsKvQuery implements TsKvQuery { | 21 | +public class BaseTsKvQuery extends BaseQuery implements TsKvQuery { |
22 | 22 | ||
23 | - private final String key; | ||
24 | - private final long startTs; | ||
25 | - private final long endTs; | ||
26 | private final long interval; | 23 | private final long interval; |
27 | private final int limit; | 24 | private final int limit; |
28 | private final Aggregation aggregation; | 25 | private final Aggregation aggregation; |
29 | private final String orderBy; | 26 | private final String orderBy; |
30 | - private final Boolean rewriteLatestIfDeleted; | ||
31 | 27 | ||
32 | - public BaseTsKvQuery(String key, long startTs, long endTs, long interval, int limit, Aggregation aggregation, String orderBy, | ||
33 | - boolean rewriteLatestIfDeleted) { | ||
34 | - this.key = key; | ||
35 | - this.startTs = startTs; | ||
36 | - this.endTs = endTs; | 28 | + public BaseTsKvQuery(String key, long startTs, long endTs, long interval, int limit, Aggregation aggregation, |
29 | + String orderBy) { | ||
30 | + super(key, startTs, endTs); | ||
37 | this.interval = interval; | 31 | this.interval = interval; |
38 | this.limit = limit; | 32 | this.limit = limit; |
39 | this.aggregation = aggregation; | 33 | this.aggregation = aggregation; |
40 | this.orderBy = orderBy; | 34 | this.orderBy = orderBy; |
41 | - this.rewriteLatestIfDeleted = rewriteLatestIfDeleted; | ||
42 | } | 35 | } |
43 | 36 | ||
44 | public BaseTsKvQuery(String key, long startTs, long endTs) { | 37 | public BaseTsKvQuery(String key, long startTs, long endTs) { |
45 | - this(key, startTs, endTs, endTs - startTs, 1, Aggregation.AVG, "DESC", false); | 38 | + this(key, startTs, endTs, endTs - startTs, 1, Aggregation.AVG, "DESC"); |
46 | } | 39 | } |
47 | 40 | ||
48 | } | 41 | } |
1 | +/** | ||
2 | + * Copyright © 2016-2018 The Thingsboard Authors | ||
3 | + * | ||
4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | + * you may not use this file except in compliance with the License. | ||
6 | + * You may obtain a copy of the License at | ||
7 | + * | ||
8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | + * | ||
10 | + * Unless required by applicable law or agreed to in writing, software | ||
11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | + * See the License for the specific language governing permissions and | ||
14 | + * limitations under the License. | ||
15 | + */ | ||
16 | +package org.thingsboard.server.common.data.kv; | ||
17 | + | ||
18 | +public interface DeleteTsKvQuery extends Query { | ||
19 | + | ||
20 | + Boolean getRewriteLatestIfDeleted(); | ||
21 | + | ||
22 | +} |
1 | +/** | ||
2 | + * Copyright © 2016-2018 The Thingsboard Authors | ||
3 | + * | ||
4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | + * you may not use this file except in compliance with the License. | ||
6 | + * You may obtain a copy of the License at | ||
7 | + * | ||
8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | + * | ||
10 | + * Unless required by applicable law or agreed to in writing, software | ||
11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | + * See the License for the specific language governing permissions and | ||
14 | + * limitations under the License. | ||
15 | + */ | ||
16 | +package org.thingsboard.server.common.data.kv; | ||
17 | + | ||
18 | +public interface Query { | ||
19 | + | ||
20 | + String getKey(); | ||
21 | + | ||
22 | + long getStartTs(); | ||
23 | + | ||
24 | + long getEndTs(); | ||
25 | + | ||
26 | +} |
@@ -15,13 +15,7 @@ | @@ -15,13 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.common.data.kv; | 16 | package org.thingsboard.server.common.data.kv; |
17 | 17 | ||
18 | -public interface TsKvQuery { | ||
19 | - | ||
20 | - String getKey(); | ||
21 | - | ||
22 | - long getStartTs(); | ||
23 | - | ||
24 | - long getEndTs(); | 18 | +public interface TsKvQuery extends Query { |
25 | 19 | ||
26 | long getInterval(); | 20 | long getInterval(); |
27 | 21 | ||
@@ -31,5 +25,4 @@ public interface TsKvQuery { | @@ -31,5 +25,4 @@ public interface TsKvQuery { | ||
31 | 25 | ||
32 | String getOrderBy(); | 26 | String getOrderBy(); |
33 | 27 | ||
34 | - Boolean getRewriteLatestIfDeleted(); | ||
35 | } | 28 | } |
@@ -17,11 +17,7 @@ package org.thingsboard.server.dao.sql.timeseries; | @@ -17,11 +17,7 @@ package org.thingsboard.server.dao.sql.timeseries; | ||
17 | 17 | ||
18 | import com.google.common.base.Function; | 18 | import com.google.common.base.Function; |
19 | import com.google.common.collect.Lists; | 19 | import com.google.common.collect.Lists; |
20 | -import com.google.common.util.concurrent.Futures; | ||
21 | -import com.google.common.util.concurrent.ListenableFuture; | ||
22 | -import com.google.common.util.concurrent.ListeningExecutorService; | ||
23 | -import com.google.common.util.concurrent.MoreExecutors; | ||
24 | -import com.google.common.util.concurrent.SettableFuture; | 20 | +import com.google.common.util.concurrent.*; |
25 | import lombok.extern.slf4j.Slf4j; | 21 | import lombok.extern.slf4j.Slf4j; |
26 | import org.springframework.beans.factory.annotation.Autowired; | 22 | import org.springframework.beans.factory.annotation.Autowired; |
27 | import org.springframework.beans.factory.annotation.Value; | 23 | import org.springframework.beans.factory.annotation.Value; |
@@ -29,11 +25,7 @@ import org.springframework.data.domain.PageRequest; | @@ -29,11 +25,7 @@ import org.springframework.data.domain.PageRequest; | ||
29 | import org.springframework.stereotype.Component; | 25 | import org.springframework.stereotype.Component; |
30 | import org.thingsboard.server.common.data.UUIDConverter; | 26 | import org.thingsboard.server.common.data.UUIDConverter; |
31 | import org.thingsboard.server.common.data.id.EntityId; | 27 | import org.thingsboard.server.common.data.id.EntityId; |
32 | -import org.thingsboard.server.common.data.kv.Aggregation; | ||
33 | -import org.thingsboard.server.common.data.kv.BasicTsKvEntry; | ||
34 | -import org.thingsboard.server.common.data.kv.StringDataEntry; | ||
35 | -import org.thingsboard.server.common.data.kv.TsKvEntry; | ||
36 | -import org.thingsboard.server.common.data.kv.TsKvQuery; | 28 | +import org.thingsboard.server.common.data.kv.*; |
37 | import org.thingsboard.server.dao.DaoUtil; | 29 | import org.thingsboard.server.dao.DaoUtil; |
38 | import org.thingsboard.server.dao.model.sql.TsKvEntity; | 30 | import org.thingsboard.server.dao.model.sql.TsKvEntity; |
39 | import org.thingsboard.server.dao.model.sql.TsKvLatestCompositeKey; | 31 | import org.thingsboard.server.dao.model.sql.TsKvLatestCompositeKey; |
@@ -307,7 +299,7 @@ public class JpaTimeseriesDao extends JpaAbstractDaoListeningExecutorService imp | @@ -307,7 +299,7 @@ public class JpaTimeseriesDao extends JpaAbstractDaoListeningExecutorService imp | ||
307 | } | 299 | } |
308 | 300 | ||
309 | @Override | 301 | @Override |
310 | - public ListenableFuture<Void> remove(EntityId entityId, TsKvQuery query) { | 302 | + public ListenableFuture<Void> remove(EntityId entityId, DeleteTsKvQuery query) { |
311 | return service.submit(() -> { | 303 | return service.submit(() -> { |
312 | tsKvRepository.delete( | 304 | tsKvRepository.delete( |
313 | fromTimeUUID(entityId.getId()), | 305 | fromTimeUUID(entityId.getId()), |
@@ -320,7 +312,7 @@ public class JpaTimeseriesDao extends JpaAbstractDaoListeningExecutorService imp | @@ -320,7 +312,7 @@ public class JpaTimeseriesDao extends JpaAbstractDaoListeningExecutorService imp | ||
320 | } | 312 | } |
321 | 313 | ||
322 | @Override | 314 | @Override |
323 | - public ListenableFuture<Void> removeLatest(EntityId entityId, TsKvQuery query) { | 315 | + public ListenableFuture<Void> removeLatest(EntityId entityId, DeleteTsKvQuery query) { |
324 | TsKvLatestEntity latestEntity = new TsKvLatestEntity(); | 316 | TsKvLatestEntity latestEntity = new TsKvLatestEntity(); |
325 | latestEntity.setEntityType(entityId.getEntityType()); | 317 | latestEntity.setEntityType(entityId.getEntityType()); |
326 | latestEntity.setEntityId(fromTimeUUID(entityId.getId())); | 318 | latestEntity.setEntityId(fromTimeUUID(entityId.getId())); |
@@ -332,7 +324,7 @@ public class JpaTimeseriesDao extends JpaAbstractDaoListeningExecutorService imp | @@ -332,7 +324,7 @@ public class JpaTimeseriesDao extends JpaAbstractDaoListeningExecutorService imp | ||
332 | } | 324 | } |
333 | 325 | ||
334 | @Override | 326 | @Override |
335 | - public ListenableFuture<Void> removePartition(EntityId entityId, TsKvQuery query) { | 327 | + public ListenableFuture<Void> removePartition(EntityId entityId, DeleteTsKvQuery query) { |
336 | return service.submit(() -> null); | 328 | return service.submit(() -> null); |
337 | } | 329 | } |
338 | 330 |
@@ -22,6 +22,7 @@ import lombok.extern.slf4j.Slf4j; | @@ -22,6 +22,7 @@ import lombok.extern.slf4j.Slf4j; | ||
22 | import org.springframework.beans.factory.annotation.Autowired; | 22 | import org.springframework.beans.factory.annotation.Autowired; |
23 | import org.springframework.stereotype.Service; | 23 | import org.springframework.stereotype.Service; |
24 | import org.thingsboard.server.common.data.id.EntityId; | 24 | import org.thingsboard.server.common.data.id.EntityId; |
25 | +import org.thingsboard.server.common.data.kv.DeleteTsKvQuery; | ||
25 | import org.thingsboard.server.common.data.kv.TsKvEntry; | 26 | import org.thingsboard.server.common.data.kv.TsKvEntry; |
26 | import org.thingsboard.server.common.data.kv.TsKvQuery; | 27 | import org.thingsboard.server.common.data.kv.TsKvQuery; |
27 | import org.thingsboard.server.dao.exception.IncorrectParameterException; | 28 | import org.thingsboard.server.dao.exception.IncorrectParameterException; |
@@ -48,7 +49,7 @@ public class BaseTimeseriesService implements TimeseriesService { | @@ -48,7 +49,7 @@ public class BaseTimeseriesService implements TimeseriesService { | ||
48 | @Override | 49 | @Override |
49 | public ListenableFuture<List<TsKvEntry>> findAll(EntityId entityId, List<TsKvQuery> queries) { | 50 | public ListenableFuture<List<TsKvEntry>> findAll(EntityId entityId, List<TsKvQuery> queries) { |
50 | validate(entityId); | 51 | validate(entityId); |
51 | - queries.forEach(query -> validate(query)); | 52 | + queries.forEach(BaseTimeseriesService::validate); |
52 | return timeseriesDao.findAllAsync(entityId, queries); | 53 | return timeseriesDao.findAllAsync(entityId, queries); |
53 | } | 54 | } |
54 | 55 | ||
@@ -97,17 +98,17 @@ public class BaseTimeseriesService implements TimeseriesService { | @@ -97,17 +98,17 @@ public class BaseTimeseriesService implements TimeseriesService { | ||
97 | } | 98 | } |
98 | 99 | ||
99 | @Override | 100 | @Override |
100 | - public ListenableFuture<List<Void>> remove(EntityId entityId, List<TsKvQuery> tsKvQueries) { | 101 | + public ListenableFuture<List<Void>> remove(EntityId entityId, List<DeleteTsKvQuery> deleteTsKvQueries) { |
101 | validate(entityId); | 102 | validate(entityId); |
102 | - tsKvQueries.forEach(BaseTimeseriesService::validate); | ||
103 | - List<ListenableFuture<Void>> futures = Lists.newArrayListWithExpectedSize(tsKvQueries.size() * DELETES_PER_ENTRY); | ||
104 | - for (TsKvQuery tsKvQuery : tsKvQueries) { | 103 | + deleteTsKvQueries.forEach(BaseTimeseriesService::validate); |
104 | + List<ListenableFuture<Void>> futures = Lists.newArrayListWithExpectedSize(deleteTsKvQueries.size() * DELETES_PER_ENTRY); | ||
105 | + for (DeleteTsKvQuery tsKvQuery : deleteTsKvQueries) { | ||
105 | deleteAndRegisterFutures(futures, entityId, tsKvQuery); | 106 | deleteAndRegisterFutures(futures, entityId, tsKvQuery); |
106 | } | 107 | } |
107 | return Futures.allAsList(futures); | 108 | return Futures.allAsList(futures); |
108 | } | 109 | } |
109 | 110 | ||
110 | - private void deleteAndRegisterFutures(List<ListenableFuture<Void>> futures, EntityId entityId, TsKvQuery query) { | 111 | + private void deleteAndRegisterFutures(List<ListenableFuture<Void>> futures, EntityId entityId, DeleteTsKvQuery query) { |
111 | futures.add(timeseriesDao.remove(entityId, query)); | 112 | futures.add(timeseriesDao.remove(entityId, query)); |
112 | futures.add(timeseriesDao.removeLatest(entityId, query)); | 113 | futures.add(timeseriesDao.removeLatest(entityId, query)); |
113 | futures.add(timeseriesDao.removePartition(entityId, query)); | 114 | futures.add(timeseriesDao.removePartition(entityId, query)); |
@@ -126,4 +127,12 @@ public class BaseTimeseriesService implements TimeseriesService { | @@ -126,4 +127,12 @@ public class BaseTimeseriesService implements TimeseriesService { | ||
126 | throw new IncorrectParameterException("Incorrect TsKvQuery. Aggregation can't be empty"); | 127 | throw new IncorrectParameterException("Incorrect TsKvQuery. Aggregation can't be empty"); |
127 | } | 128 | } |
128 | } | 129 | } |
130 | + | ||
131 | + private static void validate(DeleteTsKvQuery query) { | ||
132 | + if (query == null) { | ||
133 | + throw new IncorrectParameterException("DeleteTsKvQuery can't be null"); | ||
134 | + } else if (isBlank(query.getKey())) { | ||
135 | + throw new IncorrectParameterException("Incorrect DeleteTsKvQuery. Key can't be empty"); | ||
136 | + } | ||
137 | + } | ||
129 | } | 138 | } |
@@ -138,7 +138,7 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | @@ -138,7 +138,7 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | ||
138 | while (stepTs < query.getEndTs()) { | 138 | while (stepTs < query.getEndTs()) { |
139 | long startTs = stepTs; | 139 | long startTs = stepTs; |
140 | long endTs = stepTs + step; | 140 | long endTs = stepTs + step; |
141 | - TsKvQuery subQuery = new BaseTsKvQuery(query.getKey(), startTs, endTs, step, 1, query.getAggregation(), query.getOrderBy(), false); | 141 | + TsKvQuery subQuery = new BaseTsKvQuery(query.getKey(), startTs, endTs, step, 1, query.getAggregation(), query.getOrderBy()); |
142 | futures.add(findAndAggregateAsync(entityId, subQuery, toPartitionTs(startTs), toPartitionTs(endTs))); | 142 | futures.add(findAndAggregateAsync(entityId, subQuery, toPartitionTs(startTs), toPartitionTs(endTs))); |
143 | stepTs = endTs; | 143 | stepTs = endTs; |
144 | } | 144 | } |
@@ -346,7 +346,7 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | @@ -346,7 +346,7 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | ||
346 | } | 346 | } |
347 | 347 | ||
348 | @Override | 348 | @Override |
349 | - public ListenableFuture<Void> remove(EntityId entityId, TsKvQuery query) { | 349 | + public ListenableFuture<Void> remove(EntityId entityId, DeleteTsKvQuery query) { |
350 | long minPartition = toPartitionTs(query.getStartTs()); | 350 | long minPartition = toPartitionTs(query.getStartTs()); |
351 | long maxPartition = toPartitionTs(query.getEndTs()); | 351 | long maxPartition = toPartitionTs(query.getEndTs()); |
352 | 352 | ||
@@ -358,7 +358,7 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | @@ -358,7 +358,7 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | ||
358 | Futures.addCallback(partitionsListFuture, new FutureCallback<List<Long>>() { | 358 | Futures.addCallback(partitionsListFuture, new FutureCallback<List<Long>>() { |
359 | @Override | 359 | @Override |
360 | public void onSuccess(@Nullable List<Long> partitions) { | 360 | public void onSuccess(@Nullable List<Long> partitions) { |
361 | - TsKvQueryCursor cursor = new TsKvQueryCursor(entityId.getEntityType().name(), entityId.getId(), query, partitions); | 361 | + QueryCursor cursor = new QueryCursor(entityId.getEntityType().name(), entityId.getId(), query, partitions); |
362 | deleteAsync(cursor, resultFuture); | 362 | deleteAsync(cursor, resultFuture); |
363 | } | 363 | } |
364 | 364 | ||
@@ -370,7 +370,7 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | @@ -370,7 +370,7 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | ||
370 | return resultFuture; | 370 | return resultFuture; |
371 | } | 371 | } |
372 | 372 | ||
373 | - private void deleteAsync(final TsKvQueryCursor cursor, final SimpleListenableFuture<Void> resultFuture) { | 373 | + private void deleteAsync(final QueryCursor cursor, final SimpleListenableFuture<Void> resultFuture) { |
374 | if (!cursor.hasNextPartition()) { | 374 | if (!cursor.hasNextPartition()) { |
375 | resultFuture.set(null); | 375 | resultFuture.set(null); |
376 | } else { | 376 | } else { |
@@ -411,7 +411,7 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | @@ -411,7 +411,7 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | ||
411 | } | 411 | } |
412 | 412 | ||
413 | @Override | 413 | @Override |
414 | - public ListenableFuture<Void> removeLatest(EntityId entityId, TsKvQuery query) { | 414 | + public ListenableFuture<Void> removeLatest(EntityId entityId, DeleteTsKvQuery query) { |
415 | ListenableFuture<TsKvEntry> latestEntryFuture = findLatest(entityId, query.getKey()); | 415 | ListenableFuture<TsKvEntry> latestEntryFuture = findLatest(entityId, query.getKey()); |
416 | 416 | ||
417 | ListenableFuture<Boolean> booleanFuture = Futures.transformAsync(latestEntryFuture, latestEntry -> { | 417 | ListenableFuture<Boolean> booleanFuture = Futures.transformAsync(latestEntryFuture, latestEntry -> { |
@@ -445,11 +445,11 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | @@ -445,11 +445,11 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | ||
445 | return removedLatestFuture; | 445 | return removedLatestFuture; |
446 | } | 446 | } |
447 | 447 | ||
448 | - private ListenableFuture<Void> getNewLatestEntryFuture(EntityId entityId, TsKvQuery query) { | 448 | + private ListenableFuture<Void> getNewLatestEntryFuture(EntityId entityId, DeleteTsKvQuery query) { |
449 | long startTs = 0; | 449 | long startTs = 0; |
450 | long endTs = query.getStartTs() - 1; | 450 | long endTs = query.getStartTs() - 1; |
451 | TsKvQuery findNewLatestQuery = new BaseTsKvQuery(query.getKey(), startTs, endTs, endTs - startTs, 1, | 451 | TsKvQuery findNewLatestQuery = new BaseTsKvQuery(query.getKey(), startTs, endTs, endTs - startTs, 1, |
452 | - Aggregation.NONE, DESC_ORDER, false); | 452 | + Aggregation.NONE, DESC_ORDER); |
453 | ListenableFuture<List<TsKvEntry>> future = findAllAsync(entityId, findNewLatestQuery); | 453 | ListenableFuture<List<TsKvEntry>> future = findAllAsync(entityId, findNewLatestQuery); |
454 | 454 | ||
455 | return Futures.transformAsync(future, entryList -> { | 455 | return Futures.transformAsync(future, entryList -> { |
@@ -472,7 +472,7 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | @@ -472,7 +472,7 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | ||
472 | } | 472 | } |
473 | 473 | ||
474 | @Override | 474 | @Override |
475 | - public ListenableFuture<Void> removePartition(EntityId entityId, TsKvQuery query) { | 475 | + public ListenableFuture<Void> removePartition(EntityId entityId, DeleteTsKvQuery query) { |
476 | long minPartition = toPartitionTs(query.getStartTs()); | 476 | long minPartition = toPartitionTs(query.getStartTs()); |
477 | long maxPartition = toPartitionTs(query.getEndTs()); | 477 | long maxPartition = toPartitionTs(query.getEndTs()); |
478 | if (minPartition == maxPartition) { | 478 | if (minPartition == maxPartition) { |
@@ -494,7 +494,7 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | @@ -494,7 +494,7 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | ||
494 | for (int i = index; i < partitions.size() - 1; i++) { | 494 | for (int i = index; i < partitions.size() - 1; i++) { |
495 | partitionsToDelete.add(partitions.get(i)); | 495 | partitionsToDelete.add(partitions.get(i)); |
496 | } | 496 | } |
497 | - TsKvQueryCursor cursor = new TsKvQueryCursor(entityId.getEntityType().name(), entityId.getId(), query, partitionsToDelete); | 497 | + QueryCursor cursor = new QueryCursor(entityId.getEntityType().name(), entityId.getId(), query, partitionsToDelete); |
498 | deletePartitionAsync(cursor, resultFuture); | 498 | deletePartitionAsync(cursor, resultFuture); |
499 | } | 499 | } |
500 | 500 | ||
@@ -507,7 +507,7 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | @@ -507,7 +507,7 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem | ||
507 | } | 507 | } |
508 | } | 508 | } |
509 | 509 | ||
510 | - private void deletePartitionAsync(final TsKvQueryCursor cursor, final SimpleListenableFuture<Void> resultFuture) { | 510 | + private void deletePartitionAsync(final QueryCursor cursor, final SimpleListenableFuture<Void> resultFuture) { |
511 | if (!cursor.hasNextPartition()) { | 511 | if (!cursor.hasNextPartition()) { |
512 | resultFuture.set(null); | 512 | resultFuture.set(null); |
513 | } else { | 513 | } else { |
1 | +/** | ||
2 | + * Copyright © 2016-2018 The Thingsboard Authors | ||
3 | + * | ||
4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | + * you may not use this file except in compliance with the License. | ||
6 | + * You may obtain a copy of the License at | ||
7 | + * | ||
8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | + * | ||
10 | + * Unless required by applicable law or agreed to in writing, software | ||
11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | + * See the License for the specific language governing permissions and | ||
14 | + * limitations under the License. | ||
15 | + */ | ||
16 | +package org.thingsboard.server.dao.timeseries; | ||
17 | + | ||
18 | +import lombok.Getter; | ||
19 | +import org.thingsboard.server.common.data.kv.Query; | ||
20 | + | ||
21 | +import java.util.List; | ||
22 | +import java.util.UUID; | ||
23 | + | ||
24 | +public class QueryCursor { | ||
25 | + | ||
26 | + @Getter | ||
27 | + protected final String entityType; | ||
28 | + @Getter | ||
29 | + protected final UUID entityId; | ||
30 | + @Getter | ||
31 | + protected final String key; | ||
32 | + @Getter | ||
33 | + private final long startTs; | ||
34 | + @Getter | ||
35 | + private final long endTs; | ||
36 | + | ||
37 | + final List<Long> partitions; | ||
38 | + private int partitionIndex; | ||
39 | + | ||
40 | + public QueryCursor(String entityType, UUID entityId, Query baseQuery, List<Long> partitions) { | ||
41 | + this.entityType = entityType; | ||
42 | + this.entityId = entityId; | ||
43 | + this.key = baseQuery.getKey(); | ||
44 | + this.startTs = baseQuery.getStartTs(); | ||
45 | + this.endTs = baseQuery.getEndTs(); | ||
46 | + this.partitions = partitions; | ||
47 | + this.partitionIndex = partitions.size() - 1; | ||
48 | + } | ||
49 | + | ||
50 | + public boolean hasNextPartition() { | ||
51 | + return partitionIndex >= 0; | ||
52 | + } | ||
53 | + | ||
54 | + public long getNextPartition() { | ||
55 | + long partition = partitions.get(partitionIndex); | ||
56 | + partitionIndex--; | ||
57 | + return partition; | ||
58 | + } | ||
59 | + | ||
60 | +} |
@@ -17,6 +17,7 @@ package org.thingsboard.server.dao.timeseries; | @@ -17,6 +17,7 @@ package org.thingsboard.server.dao.timeseries; | ||
17 | 17 | ||
18 | import com.google.common.util.concurrent.ListenableFuture; | 18 | import com.google.common.util.concurrent.ListenableFuture; |
19 | import org.thingsboard.server.common.data.id.EntityId; | 19 | import org.thingsboard.server.common.data.id.EntityId; |
20 | +import org.thingsboard.server.common.data.kv.DeleteTsKvQuery; | ||
20 | import org.thingsboard.server.common.data.kv.TsKvEntry; | 21 | import org.thingsboard.server.common.data.kv.TsKvEntry; |
21 | import org.thingsboard.server.common.data.kv.TsKvQuery; | 22 | import org.thingsboard.server.common.data.kv.TsKvQuery; |
22 | 23 | ||
@@ -39,9 +40,9 @@ public interface TimeseriesDao { | @@ -39,9 +40,9 @@ public interface TimeseriesDao { | ||
39 | 40 | ||
40 | ListenableFuture<Void> saveLatest(EntityId entityId, TsKvEntry tsKvEntry); | 41 | ListenableFuture<Void> saveLatest(EntityId entityId, TsKvEntry tsKvEntry); |
41 | 42 | ||
42 | - ListenableFuture<Void> remove(EntityId entityId, TsKvQuery query); | 43 | + ListenableFuture<Void> remove(EntityId entityId, DeleteTsKvQuery query); |
43 | 44 | ||
44 | - ListenableFuture<Void> removeLatest(EntityId entityId, TsKvQuery query); | 45 | + ListenableFuture<Void> removeLatest(EntityId entityId, DeleteTsKvQuery query); |
45 | 46 | ||
46 | - ListenableFuture<Void> removePartition(EntityId entityId, TsKvQuery query); | 47 | + ListenableFuture<Void> removePartition(EntityId entityId, DeleteTsKvQuery query); |
47 | } | 48 | } |
@@ -17,6 +17,7 @@ package org.thingsboard.server.dao.timeseries; | @@ -17,6 +17,7 @@ package org.thingsboard.server.dao.timeseries; | ||
17 | 17 | ||
18 | import com.google.common.util.concurrent.ListenableFuture; | 18 | import com.google.common.util.concurrent.ListenableFuture; |
19 | import org.thingsboard.server.common.data.id.EntityId; | 19 | import org.thingsboard.server.common.data.id.EntityId; |
20 | +import org.thingsboard.server.common.data.kv.DeleteTsKvQuery; | ||
20 | import org.thingsboard.server.common.data.kv.TsKvEntry; | 21 | import org.thingsboard.server.common.data.kv.TsKvEntry; |
21 | import org.thingsboard.server.common.data.kv.TsKvQuery; | 22 | import org.thingsboard.server.common.data.kv.TsKvQuery; |
22 | 23 | ||
@@ -38,5 +39,5 @@ public interface TimeseriesService { | @@ -38,5 +39,5 @@ public interface TimeseriesService { | ||
38 | 39 | ||
39 | ListenableFuture<List<Void>> save(EntityId entityId, List<TsKvEntry> tsKvEntry, long ttl); | 40 | ListenableFuture<List<Void>> save(EntityId entityId, List<TsKvEntry> tsKvEntry, long ttl); |
40 | 41 | ||
41 | - ListenableFuture<List<Void>> remove(EntityId entityId, List<TsKvQuery> queries); | 42 | + ListenableFuture<List<Void>> remove(EntityId entityId, List<DeleteTsKvQuery> queries); |
42 | } | 43 | } |
@@ -28,18 +28,8 @@ import static org.thingsboard.server.dao.timeseries.CassandraBaseTimeseriesDao.D | @@ -28,18 +28,8 @@ import static org.thingsboard.server.dao.timeseries.CassandraBaseTimeseriesDao.D | ||
28 | /** | 28 | /** |
29 | * Created by ashvayka on 21.02.17. | 29 | * Created by ashvayka on 21.02.17. |
30 | */ | 30 | */ |
31 | -public class TsKvQueryCursor { | ||
32 | - @Getter | ||
33 | - private final String entityType; | ||
34 | - @Getter | ||
35 | - private final UUID entityId; | ||
36 | - @Getter | ||
37 | - private final String key; | ||
38 | - @Getter | ||
39 | - private final long startTs; | ||
40 | - @Getter | ||
41 | - private final long endTs; | ||
42 | - private final List<Long> partitions; | 31 | +public class TsKvQueryCursor extends QueryCursor { |
32 | + | ||
43 | @Getter | 33 | @Getter |
44 | private final List<TsKvEntry> data; | 34 | private final List<TsKvEntry> data; |
45 | @Getter | 35 | @Getter |
@@ -49,18 +39,14 @@ public class TsKvQueryCursor { | @@ -49,18 +39,14 @@ public class TsKvQueryCursor { | ||
49 | private int currentLimit; | 39 | private int currentLimit; |
50 | 40 | ||
51 | public TsKvQueryCursor(String entityType, UUID entityId, TsKvQuery baseQuery, List<Long> partitions) { | 41 | public TsKvQueryCursor(String entityType, UUID entityId, TsKvQuery baseQuery, List<Long> partitions) { |
52 | - this.entityType = entityType; | ||
53 | - this.entityId = entityId; | ||
54 | - this.key = baseQuery.getKey(); | ||
55 | - this.startTs = baseQuery.getStartTs(); | ||
56 | - this.endTs = baseQuery.getEndTs(); | ||
57 | - this.partitions = partitions; | 42 | + super(entityType, entityId, baseQuery, partitions); |
58 | this.orderBy = baseQuery.getOrderBy(); | 43 | this.orderBy = baseQuery.getOrderBy(); |
59 | this.partitionIndex = isDesc() ? partitions.size() - 1 : 0; | 44 | this.partitionIndex = isDesc() ? partitions.size() - 1 : 0; |
60 | this.data = new ArrayList<>(); | 45 | this.data = new ArrayList<>(); |
61 | this.currentLimit = baseQuery.getLimit(); | 46 | this.currentLimit = baseQuery.getLimit(); |
62 | } | 47 | } |
63 | 48 | ||
49 | + @Override | ||
64 | public boolean hasNextPartition() { | 50 | public boolean hasNextPartition() { |
65 | return isDesc() ? partitionIndex >= 0 : partitionIndex <= partitions.size() - 1; | 51 | return isDesc() ? partitionIndex >= 0 : partitionIndex <= partitions.size() - 1; |
66 | } | 52 | } |
@@ -69,6 +55,7 @@ public class TsKvQueryCursor { | @@ -69,6 +55,7 @@ public class TsKvQueryCursor { | ||
69 | return currentLimit <= 0; | 55 | return currentLimit <= 0; |
70 | } | 56 | } |
71 | 57 | ||
58 | + @Override | ||
72 | public long getNextPartition() { | 59 | public long getNextPartition() { |
73 | long partition = partitions.get(partitionIndex); | 60 | long partition = partitions.get(partitionIndex); |
74 | if (isDesc()) { | 61 | if (isDesc()) { |
@@ -20,15 +20,7 @@ import lombok.extern.slf4j.Slf4j; | @@ -20,15 +20,7 @@ import lombok.extern.slf4j.Slf4j; | ||
20 | import org.junit.Assert; | 20 | import org.junit.Assert; |
21 | import org.junit.Test; | 21 | import org.junit.Test; |
22 | import org.thingsboard.server.common.data.id.DeviceId; | 22 | import org.thingsboard.server.common.data.id.DeviceId; |
23 | -import org.thingsboard.server.common.data.kv.Aggregation; | ||
24 | -import org.thingsboard.server.common.data.kv.BaseTsKvQuery; | ||
25 | -import org.thingsboard.server.common.data.kv.BasicTsKvEntry; | ||
26 | -import org.thingsboard.server.common.data.kv.BooleanDataEntry; | ||
27 | -import org.thingsboard.server.common.data.kv.DoubleDataEntry; | ||
28 | -import org.thingsboard.server.common.data.kv.KvEntry; | ||
29 | -import org.thingsboard.server.common.data.kv.LongDataEntry; | ||
30 | -import org.thingsboard.server.common.data.kv.StringDataEntry; | ||
31 | -import org.thingsboard.server.common.data.kv.TsKvEntry; | 23 | +import org.thingsboard.server.common.data.kv.*; |
32 | import org.thingsboard.server.dao.service.AbstractServiceTest; | 24 | import org.thingsboard.server.dao.service.AbstractServiceTest; |
33 | 25 | ||
34 | import java.util.ArrayList; | 26 | import java.util.ArrayList; |
@@ -111,12 +103,10 @@ public abstract class BaseTimeseriesServiceTest extends AbstractServiceTest { | @@ -111,12 +103,10 @@ public abstract class BaseTimeseriesServiceTest extends AbstractServiceTest { | ||
111 | saveEntries(deviceId, 40000); | 103 | saveEntries(deviceId, 40000); |
112 | 104 | ||
113 | tsService.remove(deviceId, Collections.singletonList( | 105 | tsService.remove(deviceId, Collections.singletonList( |
114 | - new BaseTsKvQuery(STRING_KEY, 15000, 45000, 10000, 0, Aggregation.NONE, DESC_ORDER, | ||
115 | - false))).get(); | 106 | + new BaseDeleteTsKvQuery(STRING_KEY, 15000, 45000))).get(); |
116 | 107 | ||
117 | List<TsKvEntry> list = tsService.findAll(deviceId, Collections.singletonList( | 108 | List<TsKvEntry> list = tsService.findAll(deviceId, Collections.singletonList( |
118 | - new BaseTsKvQuery(STRING_KEY, 5000, 45000, 10000, 10, Aggregation.NONE, DESC_ORDER, | ||
119 | - false))).get(); | 109 | + new BaseTsKvQuery(STRING_KEY, 5000, 45000, 10000, 10, Aggregation.NONE, DESC_ORDER))).get(); |
120 | Assert.assertEquals(1, list.size()); | 110 | Assert.assertEquals(1, list.size()); |
121 | 111 | ||
122 | List<TsKvEntry> latest = tsService.findLatest(deviceId, Collections.singletonList(STRING_KEY)).get(); | 112 | List<TsKvEntry> latest = tsService.findLatest(deviceId, Collections.singletonList(STRING_KEY)).get(); |
@@ -138,7 +128,7 @@ public abstract class BaseTimeseriesServiceTest extends AbstractServiceTest { | @@ -138,7 +128,7 @@ public abstract class BaseTimeseriesServiceTest extends AbstractServiceTest { | ||
138 | entries.add(save(deviceId, 55000, 600)); | 128 | entries.add(save(deviceId, 55000, 600)); |
139 | 129 | ||
140 | List<TsKvEntry> list = tsService.findAll(deviceId, Collections.singletonList(new BaseTsKvQuery(LONG_KEY, 0, | 130 | List<TsKvEntry> list = tsService.findAll(deviceId, Collections.singletonList(new BaseTsKvQuery(LONG_KEY, 0, |
141 | - 60000, 20000, 3, Aggregation.NONE, DESC_ORDER, false))).get(); | 131 | + 60000, 20000, 3, Aggregation.NONE, DESC_ORDER))).get(); |
142 | assertEquals(3, list.size()); | 132 | assertEquals(3, list.size()); |
143 | assertEquals(55000, list.get(0).getTs()); | 133 | assertEquals(55000, list.get(0).getTs()); |
144 | assertEquals(java.util.Optional.of(600L), list.get(0).getLongValue()); | 134 | assertEquals(java.util.Optional.of(600L), list.get(0).getLongValue()); |
@@ -150,7 +140,7 @@ public abstract class BaseTimeseriesServiceTest extends AbstractServiceTest { | @@ -150,7 +140,7 @@ public abstract class BaseTimeseriesServiceTest extends AbstractServiceTest { | ||
150 | assertEquals(java.util.Optional.of(400L), list.get(2).getLongValue()); | 140 | assertEquals(java.util.Optional.of(400L), list.get(2).getLongValue()); |
151 | 141 | ||
152 | list = tsService.findAll(deviceId, Collections.singletonList(new BaseTsKvQuery(LONG_KEY, 0, | 142 | list = tsService.findAll(deviceId, Collections.singletonList(new BaseTsKvQuery(LONG_KEY, 0, |
153 | - 60000, 20000, 3, Aggregation.AVG, DESC_ORDER, false))).get(); | 143 | + 60000, 20000, 3, Aggregation.AVG, DESC_ORDER))).get(); |
154 | assertEquals(3, list.size()); | 144 | assertEquals(3, list.size()); |
155 | assertEquals(10000, list.get(0).getTs()); | 145 | assertEquals(10000, list.get(0).getTs()); |
156 | assertEquals(java.util.Optional.of(150L), list.get(0).getLongValue()); | 146 | assertEquals(java.util.Optional.of(150L), list.get(0).getLongValue()); |
@@ -162,7 +152,7 @@ public abstract class BaseTimeseriesServiceTest extends AbstractServiceTest { | @@ -162,7 +152,7 @@ public abstract class BaseTimeseriesServiceTest extends AbstractServiceTest { | ||
162 | assertEquals(java.util.Optional.of(550L), list.get(2).getLongValue()); | 152 | assertEquals(java.util.Optional.of(550L), list.get(2).getLongValue()); |
163 | 153 | ||
164 | list = tsService.findAll(deviceId, Collections.singletonList(new BaseTsKvQuery(LONG_KEY, 0, | 154 | list = tsService.findAll(deviceId, Collections.singletonList(new BaseTsKvQuery(LONG_KEY, 0, |
165 | - 60000, 20000, 3, Aggregation.SUM, DESC_ORDER, false))).get(); | 155 | + 60000, 20000, 3, Aggregation.SUM, DESC_ORDER))).get(); |
166 | 156 | ||
167 | assertEquals(3, list.size()); | 157 | assertEquals(3, list.size()); |
168 | assertEquals(10000, list.get(0).getTs()); | 158 | assertEquals(10000, list.get(0).getTs()); |
@@ -175,7 +165,7 @@ public abstract class BaseTimeseriesServiceTest extends AbstractServiceTest { | @@ -175,7 +165,7 @@ public abstract class BaseTimeseriesServiceTest extends AbstractServiceTest { | ||
175 | assertEquals(java.util.Optional.of(1100L), list.get(2).getLongValue()); | 165 | assertEquals(java.util.Optional.of(1100L), list.get(2).getLongValue()); |
176 | 166 | ||
177 | list = tsService.findAll(deviceId, Collections.singletonList(new BaseTsKvQuery(LONG_KEY, 0, | 167 | list = tsService.findAll(deviceId, Collections.singletonList(new BaseTsKvQuery(LONG_KEY, 0, |
178 | - 60000, 20000, 3, Aggregation.MIN, DESC_ORDER, false))).get(); | 168 | + 60000, 20000, 3, Aggregation.MIN, DESC_ORDER))).get(); |
179 | 169 | ||
180 | assertEquals(3, list.size()); | 170 | assertEquals(3, list.size()); |
181 | assertEquals(10000, list.get(0).getTs()); | 171 | assertEquals(10000, list.get(0).getTs()); |
@@ -188,7 +178,7 @@ public abstract class BaseTimeseriesServiceTest extends AbstractServiceTest { | @@ -188,7 +178,7 @@ public abstract class BaseTimeseriesServiceTest extends AbstractServiceTest { | ||
188 | assertEquals(java.util.Optional.of(500L), list.get(2).getLongValue()); | 178 | assertEquals(java.util.Optional.of(500L), list.get(2).getLongValue()); |
189 | 179 | ||
190 | list = tsService.findAll(deviceId, Collections.singletonList(new BaseTsKvQuery(LONG_KEY, 0, | 180 | list = tsService.findAll(deviceId, Collections.singletonList(new BaseTsKvQuery(LONG_KEY, 0, |
191 | - 60000, 20000, 3, Aggregation.MAX, DESC_ORDER, false))).get(); | 181 | + 60000, 20000, 3, Aggregation.MAX, DESC_ORDER))).get(); |
192 | 182 | ||
193 | assertEquals(3, list.size()); | 183 | assertEquals(3, list.size()); |
194 | assertEquals(10000, list.get(0).getTs()); | 184 | assertEquals(10000, list.get(0).getTs()); |
@@ -201,7 +191,7 @@ public abstract class BaseTimeseriesServiceTest extends AbstractServiceTest { | @@ -201,7 +191,7 @@ public abstract class BaseTimeseriesServiceTest extends AbstractServiceTest { | ||
201 | assertEquals(java.util.Optional.of(600L), list.get(2).getLongValue()); | 191 | assertEquals(java.util.Optional.of(600L), list.get(2).getLongValue()); |
202 | 192 | ||
203 | list = tsService.findAll(deviceId, Collections.singletonList(new BaseTsKvQuery(LONG_KEY, 0, | 193 | list = tsService.findAll(deviceId, Collections.singletonList(new BaseTsKvQuery(LONG_KEY, 0, |
204 | - 60000, 20000, 3, Aggregation.COUNT, DESC_ORDER, false))).get(); | 194 | + 60000, 20000, 3, Aggregation.COUNT, DESC_ORDER))).get(); |
205 | 195 | ||
206 | assertEquals(3, list.size()); | 196 | assertEquals(3, list.size()); |
207 | assertEquals(10000, list.get(0).getTs()); | 197 | assertEquals(10000, list.get(0).getTs()); |