/*
*
* Copyright (c) 2008-2015, Hazelcast, Inc. All Rights Reserved.
*
* 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 com.hazelcast.loader;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.core.MapLoaderLifecycleSupport;
import com.hazelcast.core.MapStore;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.model.BulkWriteOptions;
import com.mongodb.client.model.InsertOneModel;
import com.mongodb.client.model.Projections;
import org.bson.Document;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import static com.mongodb.client.model.Filters.eq;
import static com.mongodb.client.model.Filters.in;
/**
* MapStore implementation for MongoDB
*
* @author Viktor Gamov on 11/4/15.
* Twitter: @gamussa
*/
public class MongoMapStore implements MapStore<String, Supplement>, MapLoaderLifecycleSupport {
private MongoClient mongoClient;
private MongoCollection collection;
public MongoMapStore() {
}
@Override
public void init(HazelcastInstance hazelcastInstance, Properties properties, String mapName) {
String mongoUrl = (String) properties.get("mongo.url");
String dbName = (String) properties.get("mongo.db");
String collectionName = (String) properties.get("mongo.collection");
this.mongoClient = new MongoClient(new MongoClientURI(mongoUrl));
this.collection = mongoClient.getDatabase(dbName).getCollection(collectionName);
}
@Override
public void destroy() {
mongoClient.close();
}
@Override
public Supplement load(String key) {
System.out.println("Load " + key);
Document document = (Document) collection.find(eq("_id", key)).first();
String name = (String) document.get("name");
Integer price = document.getInteger("price");
return new Supplement(name, price);
}
@Override
public Map<String, Supplement> loadAll(Collection keys) {
System.out.println("LoadAll " + keys);
HashMap<String, Supplement> result = new HashMap<String, Supplement>();
FindIterable<Document> id = collection.find(in("_id", keys));
for (Document document : id) {
String name = (String) document.get("name");
Integer price = document.getInteger("price");
result.put(document.get("_id").toString(), new Supplement(name, price));
}
return result;
}
@Override
public Iterable<String> loadAllKeys() {
System.out.println("LoadAllKeys");
List<String> keys = new LinkedList<String>();
FindIterable<Document> ids = collection.find().projection(Projections.include("_id"));
for (Document document : ids) {
keys.add(document.get("_id").toString());
}
return keys;
}
@Override
public void store(String key, Supplement value) {
Document doc = new Document("name", value.getName()).append("price", value.getPrice()).append("_id", key);
this.collection.insertOne(doc);
//this.collection.replaceOne(doc, doc);
}
@Override
public void storeAll(Map<String, Supplement> map) {
List<InsertOneModel> batch = new LinkedList<InsertOneModel>();
for (Map.Entry<String, Supplement> entry : map.entrySet()) {
String key = entry.getKey();
Supplement value = entry.getValue();
batch.add(new InsertOneModel(
new Document("name", value.getName()).append("price", value.getPrice())
.append("_id", key)));
}
this.collection.bulkWrite(batch, new BulkWriteOptions().ordered(false));
}
@Override
public void delete(String key) {
this.collection.deleteOne(eq("_id", key));
}
@Override
public void deleteAll(Collection<String> keys) {
this.collection.deleteMany(in("_id", keys));
}
}