Revision 47135
Added by Claudio Atzori almost 7 years ago
DnetLoggerMongoDao.java | ||
---|---|---|
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 |
Also available in: Unified diff
getting rid of Jongo and its jackson databind dependency