Skip to content

Commit c439b87

Browse files
authored
getItemInfo enhancement (#20200)
* getItemInfo enhancement * use exception instead of null if not supported Signed-off-by: Mark Herwege <mark.herwege@telenet.be>
1 parent ae4472c commit c439b87

12 files changed

Lines changed: 56 additions & 42 deletions

File tree

bundles/org.openhab.persistence.dynamodb/src/main/java/org/openhab/persistence/dynamodb/internal/DynamoDBPersistenceService.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import java.util.List;
2323
import java.util.Locale;
2424
import java.util.Map;
25-
import java.util.Set;
2625
import java.util.concurrent.CompletableFuture;
2726
import java.util.concurrent.ConcurrentHashMap;
2827
import java.util.concurrent.ExecutionException;
@@ -46,7 +45,6 @@
4645
import org.openhab.core.library.types.QuantityType;
4746
import org.openhab.core.persistence.FilterCriteria;
4847
import org.openhab.core.persistence.HistoricItem;
49-
import org.openhab.core.persistence.PersistenceItemInfo;
5048
import org.openhab.core.persistence.PersistenceService;
5149
import org.openhab.core.persistence.QueryablePersistenceService;
5250
import org.openhab.core.persistence.strategy.PersistenceStrategy;
@@ -343,11 +341,6 @@ public String getLabel(@Nullable Locale locale) {
343341
return "DynamoDB";
344342
}
345343

346-
@Override
347-
public Set<PersistenceItemInfo> getItemInfo() {
348-
return Collections.emptySet();
349-
}
350-
351344
@Override
352345
public Iterable<HistoricItem> query(FilterCriteria filter) {
353346
return query(filter, null);

bundles/org.openhab.persistence.influxdb/src/main/java/org/openhab/persistence/influxdb/InfluxDBPersistenceService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ public String getLabel(@Nullable Locale locale) {
173173
}
174174

175175
@Override
176-
public Set<PersistenceItemInfo> getItemInfo() {
176+
public Set<PersistenceItemInfo> getItemInfo() throws UnsupportedOperationException {
177177
if (checkConnection()) {
178178
return influxDBRepository.getStoredItemsCount().entrySet().stream().map(InfluxDBPersistentItemInfo::new)
179179
.collect(Collectors.toUnmodifiableSet());

bundles/org.openhab.persistence.influxdb/src/main/java/org/openhab/persistence/influxdb/internal/InfluxDBRepository.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,11 @@ public interface InfluxDBRepository {
5656
/**
5757
* Return all stored item names with its count of stored points
5858
*
59-
* @return Map with {@code <ItemName,ItemCount>} entries
59+
* @return Map with {@code <ItemName,ItemCount>}
60+
* @throws UnsupportedOperationException if influxDB persistence service version implementation does not support
61+
* this method
6062
*/
61-
Map<String, Integer> getStoredItemsCount();
63+
Map<String, Integer> getStoredItemsCount() throws UnsupportedOperationException;
6264

6365
/**
6466
* Executes Flux query

bundles/org.openhab.persistence.influxdb/src/main/java/org/openhab/persistence/influxdb/internal/influx1/InfluxDB1RepositoryImpl.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717
import java.time.Instant;
1818
import java.util.ArrayList;
19-
import java.util.Collections;
2019
import java.util.List;
2120
import java.util.Map;
2221
import java.util.Objects;
@@ -229,7 +228,7 @@ private List<InfluxRow> convertClientResultToRepository(List<QueryResult.Result>
229228
}
230229

231230
@Override
232-
public Map<String, Integer> getStoredItemsCount() {
233-
return Collections.emptyMap();
231+
public Map<String, Integer> getStoredItemsCount() throws UnsupportedOperationException {
232+
throw new UnsupportedOperationException("getItemInfo not supported for persistence service influxDB1");
234233
}
235234
}

bundles/org.openhab.persistence.inmemory/src/main/java/org/openhab/persistence/inmemory/internal/InMemoryPersistenceService.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,16 @@ public Set<PersistenceItemInfo> getItemInfo() {
115115
return persistMap.entrySet().stream().map(this::toItemInfo).collect(Collectors.toSet());
116116
}
117117

118+
@Override
119+
public @Nullable PersistenceItemInfo getItemInfo(String itemName, @Nullable String alias) {
120+
String finalName = Objects.requireNonNullElse(alias, itemName);
121+
PersistItem item = persistMap.get(finalName);
122+
if (item == null) {
123+
return null;
124+
}
125+
return toItemInfo(Map.entry(finalName, item));
126+
}
127+
118128
@Override
119129
public void store(Item item) {
120130
internalStore(item.getName(), ZonedDateTime.now(), item.getState());

bundles/org.openhab.persistence.jdbc/src/main/java/org/openhab/persistence/jdbc/internal/JdbcMapper.java

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,11 @@
1515
import java.sql.SQLInvalidAuthorizationSpecException;
1616
import java.time.ZonedDateTime;
1717
import java.util.ArrayList;
18+
import java.util.Date;
1819
import java.util.HashMap;
1920
import java.util.List;
2021
import java.util.Map;
22+
import java.util.NoSuchElementException;
2123
import java.util.Objects;
2224
import java.util.Set;
2325
import java.util.stream.Collectors;
@@ -29,6 +31,7 @@
2931
import org.openhab.core.items.Item;
3032
import org.openhab.core.items.ItemUtil;
3133
import org.openhab.core.persistence.FilterCriteria;
34+
import org.openhab.core.persistence.FilterCriteria.Ordering;
3235
import org.openhab.core.persistence.HistoricItem;
3336
import org.openhab.core.persistence.PersistenceItemInfo;
3437
import org.openhab.core.types.State;
@@ -477,7 +480,30 @@ protected Set<PersistenceItemInfo> getItems() {
477480
// TODO: in general it would be possible to query the count, earliest and latest values for each item too but it
478481
// would be a very costly operation
479482
return itemNameToTableNameMap.keySet().stream().map(itemName -> new JdbcPersistenceItemInfo(itemName))
480-
.collect(Collectors.<PersistenceItemInfo> toSet());
483+
.collect(Collectors.<PersistenceItemInfo>toSet());
484+
}
485+
486+
protected @Nullable PersistenceItemInfo getItem(Item item, @Nullable String alias) {
487+
String itemName = item.getName();
488+
String localAlias = alias != null ? alias : itemName;
489+
String tableName = itemNameToTableNameMap.get(localAlias);
490+
491+
if (tableName != null) {
492+
try {
493+
Integer count = Math.toIntExact(getRowCount(tableName));
494+
FilterCriteria filter = new FilterCriteria().setItemName(localAlias).setPageSize(1);
495+
filter.setOrdering(Ordering.DESCENDING);
496+
Date latest = Date.from(getHistItemFilterQuery(filter, count, tableName, item).getFirst().getInstant());
497+
filter.setOrdering(Ordering.ASCENDING);
498+
Date earliest = Date
499+
.from(getHistItemFilterQuery(filter, count, tableName, item).getFirst().getInstant());
500+
return new JdbcPersistenceItemInfo(localAlias, count, earliest, latest);
501+
} catch (JdbcSQLException | ArithmeticException | NoSuchElementException e) {
502+
logger.info("JDBC::getItem: Failed getting persisted item {} info", itemName);
503+
return null;
504+
}
505+
}
506+
return null;
481507
}
482508

483509
/*****************

bundles/org.openhab.persistence.jdbc/src/main/java/org/openhab/persistence/jdbc/internal/JdbcPersistenceService.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,15 @@ public Set<PersistenceItemInfo> getItemInfo() {
185185
return getItems();
186186
}
187187

188+
@Override
189+
public @Nullable PersistenceItemInfo getItemInfo(String itemName, @Nullable String alias) {
190+
Item item = itemRegistry.get(itemName);
191+
if (item == null) {
192+
return null;
193+
}
194+
return getItem(item, alias);
195+
}
196+
188197
/**
189198
* Queries the {@link PersistenceService} for data with a given filter
190199
* criteria

bundles/org.openhab.persistence.jpa/src/main/java/org/openhab/persistence/jpa/internal/JpaPersistenceService.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
import java.util.List;
1818
import java.util.Locale;
1919
import java.util.Map;
20-
import java.util.Set;
2120

2221
import org.eclipse.jdt.annotation.NonNullByDefault;
2322
import org.eclipse.jdt.annotation.Nullable;
@@ -28,7 +27,6 @@
2827
import org.openhab.core.persistence.FilterCriteria;
2928
import org.openhab.core.persistence.FilterCriteria.Ordering;
3029
import org.openhab.core.persistence.HistoricItem;
31-
import org.openhab.core.persistence.PersistenceItemInfo;
3230
import org.openhab.core.persistence.PersistenceService;
3331
import org.openhab.core.persistence.QueryablePersistenceService;
3432
import org.openhab.core.persistence.strategy.PersistenceStrategy;
@@ -181,11 +179,6 @@ public void store(Item item, @Nullable String alias) {
181179
logger.debug("Storing item...done");
182180
}
183181

184-
@Override
185-
public Set<PersistenceItemInfo> getItemInfo() {
186-
return Set.of();
187-
}
188-
189182
@Override
190183
public Iterable<HistoricItem> query(FilterCriteria filter) {
191184
return query(filter, null);

bundles/org.openhab.persistence.mapdb/src/main/java/org/openhab/persistence/mapdb/internal/MapDbItem.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -103,10 +103,6 @@ public String toString() {
103103

104104
@Override
105105
public @Nullable Date getLatest() {
106-
return null;
107-
}
108-
109-
boolean isValid() {
110-
return name != null && state != null && timestamp != null;
106+
return timestamp;
111107
}
112108
}

bundles/org.openhab.persistence.mapdb/src/main/java/org/openhab/persistence/mapdb/internal/MapDbPersistenceService.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ public String getLabel(@Nullable Locale locale) {
185185
@Override
186186
public Set<PersistenceItemInfo> getItemInfo() {
187187
return map.values().stream().map(this::deserialize).flatMap(MapDbPersistenceService::streamOptional)
188-
.collect(Collectors.<PersistenceItemInfo> toUnmodifiableSet());
188+
.collect(Collectors.<PersistenceItemInfo>toUnmodifiableSet());
189189
}
190190

191191
@Override
@@ -263,10 +263,9 @@ private String serialize(MapDbItem item) {
263263
return mapper.toJson(item);
264264
}
265265

266-
@SuppressWarnings("null")
267266
private Optional<MapDbItem> deserialize(String json) {
268267
MapDbItem item = mapper.fromJson(json, MapDbItem.class);
269-
if (item == null || !item.isValid()) {
268+
if (item == null) {
270269
logger.warn("Deserialized invalid item: {}", item);
271270
return Optional.empty();
272271
} else if (logger.isDebugEnabled()) {

0 commit comments

Comments
 (0)