2 |
2 |
|
3 |
3 |
import java.util.*;
|
4 |
4 |
import java.util.Map.Entry;
|
|
5 |
import java.util.function.Consumer;
|
5 |
6 |
|
6 |
7 |
import com.google.common.collect.Lists;
|
7 |
8 |
import com.google.common.collect.Maps;
|
|
9 |
import com.google.common.collect.Sets;
|
8 |
10 |
import com.mongodb.BasicDBObject;
|
9 |
11 |
import com.mongodb.BasicDBObjectBuilder;
|
10 |
12 |
import com.mongodb.DBObject;
|
|
13 |
import com.mongodb.client.MongoCollection;
|
|
14 |
import com.mongodb.client.MongoCursor;
|
|
15 |
import com.mongodb.client.MongoDatabase;
|
11 |
16 |
import com.mongodb.client.model.Filters;
|
|
17 |
import com.mongodb.client.model.IndexOptions;
|
12 |
18 |
import eu.dnetlib.common.logging.LogMessage;
|
13 |
19 |
import org.apache.commons.lang.StringUtils;
|
14 |
20 |
import org.apache.commons.logging.Log;
|
15 |
21 |
import org.apache.commons.logging.LogFactory;
|
|
22 |
import org.bson.Document;
|
16 |
23 |
import org.bson.conversions.Bson;
|
17 |
|
import org.jongo.Jongo;
|
18 |
|
import org.jongo.MongoCollection;
|
19 |
|
import org.jongo.MongoCursor;
|
20 |
24 |
import org.springframework.beans.factory.annotation.Autowired;
|
21 |
25 |
|
22 |
26 |
public class DnetLoggerMongoDao implements DnetLoggerDao {
|
... | ... | |
24 |
28 |
private static final Log log = LogFactory.getLog(DnetLoggerMongoDao.class);
|
25 |
29 |
|
26 |
30 |
@Autowired
|
27 |
|
private Jongo db;
|
|
31 |
private MongoDatabase db;
|
28 |
32 |
|
|
33 |
private IndexOptions indexOptions = new IndexOptions().background(true);
|
|
34 |
|
29 |
35 |
@Override
|
30 |
36 |
public void init(final String collection) {
|
31 |
|
final Set<String> collections = db.getDatabase().getCollectionNames();
|
|
37 |
final Set<String> collections = Sets.newHashSet();
|
|
38 |
db.listCollectionNames().forEach((Consumer<? super String>) c -> collections.add(c));
|
|
39 |
|
32 |
40 |
if (!Lists.newArrayList(collections).contains(collection)) {
|
33 |
41 |
log.info(String.format("creating collection %s", collection));
|
34 |
|
db.getDatabase().createCollection(collection, new BasicDBObject());
|
|
42 |
db.createCollection(collection);
|
35 |
43 |
}
|
36 |
44 |
}
|
37 |
45 |
|
38 |
46 |
@Override
|
39 |
47 |
public void configureIndex(final String collection, final Map<String, IndexConf> conf) {
|
40 |
|
final MongoCollection coll = db.getCollection(collection);
|
|
48 |
final MongoCollection<Document> coll = db.getCollection(collection);
|
41 |
49 |
coll.dropIndexes();
|
42 |
50 |
for (String key : conf.keySet()) {
|
43 |
|
coll.ensureIndex("{'"+key+"':1}");
|
|
51 |
coll.createIndex(new BasicDBObject(key, 1), indexOptions);
|
44 |
52 |
}
|
45 |
53 |
}
|
46 |
54 |
|
... | ... | |
48 |
56 |
public void writeLog(final String collection, final Map<String, Object> map) {
|
49 |
57 |
final MongoCollection coll = db.getCollection(collection);
|
50 |
58 |
DBObject obj = BasicDBObjectBuilder.start(replaceKeyNames(map)).get();
|
51 |
|
coll.insert(obj);
|
|
59 |
coll.insertOne(obj);
|
52 |
60 |
}
|
53 |
61 |
|
54 |
62 |
private Map<String, Object> replaceKeyNames(final Map<String, Object> inputMap) {
|
... | ... | |
69 |
77 |
@Override
|
70 |
78 |
public Map<String, String> findOne(final String collection, final String key, final String value) {
|
71 |
79 |
final MongoCollection coll = db.getCollection(collection);
|
72 |
|
//final DBObject obj = coll.find(Filters.eq(key, value)).first();
|
73 |
|
final DBObject obj = coll.findOne(getBasicQuery(key, value)).as(BasicDBObject.class);
|
|
80 |
final DBObject obj = (DBObject) coll.find(Filters.eq(key, value), DBObject.class).first();
|
|
81 |
//final DBObject obj = coll.find(getBasicQuery(key, value)).as(BasicDBObject.class);
|
74 |
82 |
|
75 |
83 |
return dbObject2Map(obj);
|
76 |
84 |
}
|
... | ... | |
78 |
86 |
@Override
|
79 |
87 |
public Iterator<Map<String, String>> obtainLogIterator(final String collection) {
|
80 |
88 |
final MongoCollection coll = db.getCollection(collection);
|
81 |
|
return iter(collection, coll.find().as(BasicDBObject.class));
|
|
89 |
return iter(coll.find().iterator());
|
82 |
90 |
}
|
83 |
91 |
|
84 |
92 |
@Override
|
85 |
93 |
public Iterator<Map<String, String>> find(final String collection, final String key, final String value) {
|
86 |
94 |
final MongoCollection coll = db.getCollection(collection);
|
87 |
|
return iter(collection, coll.find(getBasicQuery(key, value)).as(BasicDBObject.class));
|
|
95 |
return iter(coll.find(getBasicQuery(key, value)).iterator());
|
88 |
96 |
}
|
89 |
97 |
|
90 |
98 |
@Override
|
91 |
99 |
public Iterator<Map<String, String>> find(final String collection, final Map<String, Object> criteria) {
|
92 |
100 |
final MongoCollection coll = db.getCollection(collection);
|
93 |
|
final String query = getCustomQuery(criteria);
|
94 |
|
return iter(collection, coll.find(query).as(BasicDBObject.class));
|
|
101 |
return iter(coll.find(getCustomQuery(criteria)).iterator());
|
95 |
102 |
}
|
96 |
103 |
|
97 |
104 |
@Override
|
98 |
105 |
public Iterator<Map<String, String>> findByDateRange(final String collection, final Date startDate, final Date endDate) {
|
99 |
106 |
final MongoCollection coll = db.getCollection(collection);
|
100 |
|
//Bson dateQuery = dateRangeQuery(startDate, endDate);
|
101 |
|
|
102 |
|
//Filters.and(Filters.gte(LogMessage.LOG_DATE_FIELD, startDate.getTime()), Filters.lt(LogMessage.LOG_DATE_FIELD, endDate.getTime()));
|
103 |
|
final String query = getDateQuery(startDate, endDate);
|
104 |
|
|
105 |
|
// System.out.println(mongoQueryObject);
|
106 |
|
return iter(collection, coll.find(query).as(BasicDBObject.class));
|
|
107 |
return iter(coll.find(getDateQuery(startDate, endDate)).iterator());
|
107 |
108 |
}
|
108 |
109 |
|
109 |
110 |
@Override
|
110 |
111 |
public Iterator<Map<String, String>> findByDateRange(final String collection, final Date startDate, final Date endDate, final String key, final String value) {
|
111 |
112 |
final MongoCollection coll = db.getCollection(collection);
|
112 |
|
final String dateQuery = getDateQuery(startDate, endDate);
|
113 |
|
final String customQuery = getBasicQuery(key, value);
|
114 |
|
|
115 |
|
|
116 |
|
final StringBuilder sb = new StringBuilder("{'"+key+"':'"+value+"',");
|
117 |
|
sb.append(StringUtils.removeEnd(sb.toString(), ","))
|
118 |
|
.append("'" + LogMessage.LOG_DATE_FIELD + "' : {$gte:"+startDate.getTime()+"},")
|
119 |
|
.append("'" + LogMessage.LOG_DATE_FIELD + "' : {$lt:"+endDate.getTime()+"}}");
|
120 |
|
|
121 |
|
return iter(collection, coll.find(sb.toString()).as(BasicDBObject.class));
|
|
113 |
final Bson query = Filters.and(getBasicQuery(key, value), getDateQuery(startDate, endDate));
|
|
114 |
return iter(coll.find(query).iterator());
|
122 |
115 |
}
|
123 |
116 |
|
124 |
117 |
@Override
|
125 |
118 |
public Iterator<Map<String, String>> findByDateRange(final String collection, final Date startDate, final Date endDate, final Map<String, Object> criteria) {
|
126 |
119 |
final MongoCollection coll = db.getCollection(collection);
|
127 |
|
//final Bson dateQuery = dateRangeQuery(startDate, endDate);
|
128 |
|
//final BasicDBObject customQuery = new BasicDBObject(criteria);
|
129 |
|
|
130 |
|
final StringBuilder sb = new StringBuilder("{");
|
131 |
|
for(Entry<String, Object> e : criteria.entrySet()) {
|
132 |
|
sb.append("'" + e.getKey() + "':'" + e.getValue() + "', ");
|
133 |
|
}
|
134 |
|
sb.append(StringUtils.removeEnd(sb.toString(), ","))
|
135 |
|
.append("'" + LogMessage.LOG_DATE_FIELD + "' : {$gte:"+startDate.getTime()+"},")
|
136 |
|
.append("'" + LogMessage.LOG_DATE_FIELD + "' : {$lt:"+endDate.getTime()+"}}");
|
137 |
|
|
138 |
|
return iter(collection, coll.find(sb.toString()).as(BasicDBObject.class));
|
|
120 |
final Bson query = Filters.and(getCustomQuery(criteria), getDateQuery(startDate, endDate));
|
|
121 |
return iter(coll.find(query).iterator());
|
139 |
122 |
}
|
140 |
123 |
|
141 |
124 |
@Override
|
142 |
125 |
public Iterator<Map<String, String>> find(final String collection, final String mongoquery, final List<String> fields) {
|
143 |
126 |
final MongoCollection coll = db.getCollection(collection);
|
144 |
|
return iter(collection, coll.find(mongoquery).as(BasicDBObject.class));
|
|
127 |
final Bson query = BasicDBObject.parse(mongoquery);
|
|
128 |
return iter(coll.find(query).iterator());
|
145 |
129 |
}
|
146 |
130 |
|
147 |
|
private String getBasicQuery(final String key, final String value) {
|
148 |
|
return "{'"+key+"':'"+value+"'}";
|
|
131 |
private Bson getBasicQuery(final String key, final String value) {
|
|
132 |
return new BasicDBObject(key, value);
|
149 |
133 |
}
|
150 |
|
private String getDateQuery(final Date startDate, final Date endDate) {
|
151 |
|
return "{'" + LogMessage.LOG_DATE_FIELD + "' : {$gte:"+startDate.getTime()+"}, '" + LogMessage.LOG_DATE_FIELD + "' : {$lt:"+endDate.getTime()+"} }";
|
|
134 |
|
|
135 |
private Bson getDateQuery(final Date startDate, final Date endDate) {
|
|
136 |
return Filters.and(
|
|
137 |
Filters.gte(LogMessage.LOG_DATE_FIELD, startDate.getTime()),
|
|
138 |
Filters.lt(LogMessage.LOG_DATE_FIELD, endDate.getTime()));
|
152 |
139 |
}
|
153 |
|
private String getCustomQuery(final Map<String, Object> criteria) {
|
154 |
|
final StringBuilder sb = new StringBuilder("{");
|
155 |
|
for(Entry<String, Object> e : criteria.entrySet()) {
|
156 |
|
sb.append("'" + e.getKey() + "':'" + e.getValue() + "', ");
|
157 |
|
}
|
158 |
|
return StringUtils.removeEnd(sb.toString(), ",") + "}";
|
|
140 |
|
|
141 |
private Bson getCustomQuery(final Map<String, Object> criteria) {
|
|
142 |
final BasicDBObjectBuilder b = new BasicDBObjectBuilder();
|
|
143 |
criteria.forEach((k, v) -> b.add(k, v));
|
|
144 |
return (BasicDBObject) b.get();
|
159 |
145 |
}
|
160 |
146 |
|
161 |
|
|
162 |
147 |
private Bson dateRangeQuery(final Date startDate, final Date endDate) {
|
163 |
148 |
Bson dateFilter = Filters.and(Filters.gte(LogMessage.LOG_DATE_FIELD, startDate.getTime()), Filters.lt(LogMessage.LOG_DATE_FIELD, endDate.getTime()));
|
164 |
149 |
log.debug("Date filter created: " + dateFilter);
|
... | ... | |
166 |
151 |
return dateFilter;
|
167 |
152 |
}
|
168 |
153 |
|
169 |
|
private Iterator<Map<String, String>> iter(final String collection, final MongoCursor<BasicDBObject> cursor) {
|
|
154 |
private Iterator<Map<String, String>> iter(final MongoCursor<BasicDBObject> cursor) {
|
170 |
155 |
return new Iterator<Map<String, String>>() {
|
171 |
156 |
|
172 |
157 |
@Override
|
getting rid of Jongo and its jackson databind dependency