Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[mongodb] Collection per Item #10202

Merged
merged 1 commit into from
Mar 13, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions bundles/org.openhab.persistence.mongodb/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ This service can be configured in the file `services/mongodb.cfg`.
| ---------- | ------- | :------: | ---------------------------------------------------------------------------- |
| url | | Yes | connection URL to address MongoDB. For example, `mongodb://localhost:27017` |
| database | | Yes | database name |
| collection | | Yes | collection name |
| collection | | Yes | set collection to "" if it shall generate a collection per item |

All item and event related configuration is done in the file `persistence/mongodb.persist`.
If you have a username and password it looks like this: url = mongodb://[username]:[password]@[localhost]:27017/[database]
The database is required: http://mongodb.github.io/mongo-java-driver/3.9/javadoc/com/mongodb/MongoClientURI.html

All item and event related configuration is done in the file `persistence/mongodb.persist`.
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ public class MongoDBPersistenceService implements QueryablePersistenceService {
private @NonNullByDefault({}) String url;
private @NonNullByDefault({}) String db;
private @NonNullByDefault({}) String collection;
private boolean collectionPerItem;

private boolean initialized = false;

Expand Down Expand Up @@ -117,9 +118,9 @@ public void activate(final BundleContext bundleContext, final Map<String, Object
collection = (String) config.get("collection");
logger.debug("MongoDB collection {}", collection);
if (collection == null || collection.isBlank()) {
logger.warn(
"The MongoDB database collection is missing - please configure the mongodb:collection parameter.");
return;
collectionPerItem = false;
} else {
collectionPerItem = true;
}

disconnectFromDatabase();
Expand Down Expand Up @@ -172,6 +173,12 @@ public void store(Item item, @Nullable String alias) {
}

String realName = item.getName();

// If collection Per Item is active, connect to the item Collection
if (collectionPerItem) {
connectToCollection(realName);
}

String name = (alias != null) ? alias : realName;
Object value = this.convertValue(item.getState());

Expand All @@ -183,6 +190,11 @@ public void store(Item item, @Nullable String alias) {
obj.put(FIELD_VALUE, value);
this.mongoCollection.save(obj);

// If collection Per Item is active, disconnect after save.
if (collectionPerItem) {
disconnectFromCollection();
}

logger.debug("MongoDB save {}={}", name, value);
}

Expand Down Expand Up @@ -229,18 +241,44 @@ private void connectToDatabase() {
try {
logger.debug("Connect MongoDB");
this.cl = new MongoClient(new MongoClientURI(this.url));
mongoCollection = cl.getDB(this.db).getCollection(this.collection);
if (collectionPerItem) {
mongoCollection = cl.getDB(this.db).getCollection(this.collection);

BasicDBObject idx = new BasicDBObject();
idx.append(FIELD_TIMESTAMP, 1).append(FIELD_ITEM, 1);
this.mongoCollection.createIndex(idx);
}

BasicDBObject idx = new BasicDBObject();
idx.append(FIELD_TIMESTAMP, 1).append(FIELD_ITEM, 1);
this.mongoCollection.createIndex(idx);
logger.debug("Connect MongoDB ... done");
} catch (Exception e) {
logger.error("Failed to connect to database {}", this.url);
throw new RuntimeException("Cannot connect to database", e);
}
}

/**
* Connects to the Collection
*/
private void connectToCollection(String collectionName) {
try {
mongoCollection = cl.getDB(this.db).getCollection(collectionName);

BasicDBObject idx = new BasicDBObject();
idx.append(FIELD_TIMESTAMP, 1).append(FIELD_ITEM, 1);
this.mongoCollection.createIndex(idx);
} catch (Exception e) {
logger.error("Failed to connect to collection {}", collectionName);
throw new RuntimeException("Cannot connect to collection", e);
}
}

/**
* Disconnects from the Collection
*/
private void disconnectFromCollection() {
this.mongoCollection = null;
}

/**
* Disconnects from the database
*/
Expand All @@ -267,6 +305,11 @@ public Iterable<HistoricItem> query(FilterCriteria filter) {
}

String name = filter.getItemName();

// If collection Per Item is active, connect to the item Collection
if (collectionPerItem) {
connectToCollection(name);
}
Item item = getItem(name);

List<HistoricItem> items = new ArrayList<>();
Expand Down Expand Up @@ -315,6 +358,10 @@ public Iterable<HistoricItem> query(FilterCriteria filter) {
ZonedDateTime.ofInstant(obj.getDate(FIELD_TIMESTAMP).toInstant(), ZoneId.systemDefault())));
}

// If collection Per Item is active, disconnect after save.
if (collectionPerItem) {
disconnectFromCollection();
}
return items;
}

Expand Down