package org.oliot.epcis.service.query.mongodb;
import java.util.Iterator;
import java.util.Set;
import org.bson.BsonArray;
import org.bson.BsonBoolean;
import org.bson.BsonDocument;
import org.bson.BsonDouble;
import org.bson.BsonInt32;
import org.bson.BsonInt64;
import org.bson.BsonRegularExpression;
import org.bson.BsonString;
import org.bson.BsonValue;
import org.oliot.epcis.configuration.Configuration;
import com.mongodb.client.MongoCollection;
/**
* Copyright (C) 2014 Jaewook Jack Byun
*
* This project is part of Oliot (oliot.org), pursuing the implementation of
* Electronic Product Code Information Service(EPCIS) v1.1 specification in
* EPCglobal.
* [http://www.gs1.org/gsmp/kc/epcglobal/epcis/epcis_1_1-standard-20140520.pdf]
*
*
* @author Jaewook Jack Byun, Ph.D student
*
* Korea Advanced Institute of Science and Technology (KAIST)
*
* Real-time Embedded System Laboratory(RESL)
*
* bjw0829@kaist.ac.kr, bjw0829@gmail.com
*/
public class MongoQueryUtil {
static BsonDocument getINQueryObject(String field, Set<String> set) {
BsonArray subStringList = new BsonArray();
Iterator<String> setIter = set.iterator();
while (setIter.hasNext()) {
String str = setIter.next();
subStringList.add(new BsonString(str));
}
if (subStringList.isEmpty() == false) {
BsonDocument query = new BsonDocument();
query.put(field, new BsonDocument("$in", subStringList));
return query;
}
return null;
}
static BsonDocument getExistsQueryObject(String field, String str) {
BsonDocument query = new BsonDocument();
str = encodeMongoObjectKey(str);
query.put(field + "." + str, new BsonDocument("$exists", new BsonBoolean(true)));
return query;
}
static BsonDocument getINQueryObject(String field, String csv) {
String[] eqArr = csv.split(",");
BsonArray subStringList = new BsonArray();
for (int i = 0; i < eqArr.length; i++) {
String eqString = eqArr[i].trim();
subStringList.add(new BsonString(eqString));
}
if (subStringList.isEmpty() == false) {
BsonDocument query = new BsonDocument();
query.put(field, new BsonDocument("$in", subStringList));
return query;
}
return null;
}
static BsonDocument getVocFamilyQueryObject(String type, String field, String csv) {
String[] paramValueArr = csv.split(",");
BsonDocument query = new BsonDocument();
for (int i = 0; i < paramValueArr.length; i++) {
String val = paramValueArr[i].trim();
type = encodeMongoObjectKey(type);
query.put(field+"."+type, new BsonString(val));
}
if (query.isEmpty() == false) {
return query;
}
return null;
}
@Deprecated
static BsonDocument getVocFamilyQueryObjectLegacy(String type, String field, String csv) {
String[] paramValueArr = csv.split(",");
BsonArray subObjectList = new BsonArray();
for (int i = 0; i < paramValueArr.length; i++) {
String val = paramValueArr[i].trim();
BsonDocument dbo = new BsonDocument();
dbo.put("id", new BsonString(type));
dbo.put("value", new BsonString(val));
subObjectList.add(dbo);
}
if (subObjectList.isEmpty() == false) {
BsonDocument query = new BsonDocument();
query.put(field, new BsonDocument("$in", subObjectList));
return query;
}
return null;
}
static BsonDocument getINFamilyQueryObject(String type, String field, String csv) {
String[] paramValueArr = csv.split(",");
BsonArray subObjectList = new BsonArray();
for (int i = 0; i < paramValueArr.length; i++) {
String val = paramValueArr[i].trim();
BsonDocument dbo = new BsonDocument();
dbo.put(type, new BsonString(val));
subObjectList.add(dbo);
}
if (subObjectList.isEmpty() == false) {
BsonDocument query = new BsonDocument();
query.put(field, new BsonDocument("$in", subObjectList));
return query;
}
return null;
}
static BsonDocument getINExtensionQueryObject(String type, String[] fields, String csv) {
String[] paramValueArr = csv.split(",");
BsonArray subStringList = new BsonArray();
for (int i = 0; i < paramValueArr.length; i++) {
String val = paramValueArr[i].trim();
subStringList.add(converseType(val));
}
if (subStringList.isEmpty() == false) {
BsonArray subList = new BsonArray();
for (int i = 0; i < fields.length; i++) {
BsonDocument sub = new BsonDocument();
sub.put(fields[i], new BsonDocument("$in", subStringList));
subList.add(sub);
}
BsonDocument subBase = new BsonDocument();
subBase.put("$or", subList);
return subBase;
}
return null;
}
static BsonDocument getCompExtensionQueryObject(String type, String[] fields, String value, String comp) {
if (comp.equals("GT")) {
BsonArray subList = new BsonArray();
for (int i = 0; i < fields.length; i++) {
BsonDocument sub = new BsonDocument();
sub.put(fields[i], new BsonDocument("$gt", converseType(value)));
subList.add(sub);
}
BsonDocument subBase = new BsonDocument();
subBase.put("$or", subList);
return subBase;
} else if (comp.equals("GE")) {
BsonArray subList = new BsonArray();
for (int i = 0; i < fields.length; i++) {
BsonDocument sub = new BsonDocument();
sub.put(fields[i], new BsonDocument("$gte", converseType(value)));
subList.add(sub);
}
BsonDocument subBase = new BsonDocument();
subBase.put("$or", subList);
return subBase;
} else if (comp.equals("LT")) {
BsonArray subList = new BsonArray();
for (int i = 0; i < fields.length; i++) {
BsonDocument sub = new BsonDocument();
sub.put(fields[i], new BsonDocument("$lt", converseType(value)));
subList.add(sub);
}
BsonDocument subBase = new BsonDocument();
subBase.put("$or", subList);
return subBase;
} else if (comp.equals("LE")) {
BsonArray subList = new BsonArray();
for (int i = 0; i < fields.length; i++) {
BsonDocument sub = new BsonDocument();
sub.put(fields[i], new BsonDocument("$lte", converseType(value)));
subList.add(sub);
}
BsonDocument subBase = new BsonDocument();
subBase.put("$or", subList);
return subBase;
}
return null;
}
static BsonDocument getINQueryObject(String[] fields, String csv) {
String[] eqArr = csv.split(",");
BsonArray subStringList = new BsonArray();
for (int i = 0; i < eqArr.length; i++) {
String eqString = eqArr[i].trim();
subStringList.add(new BsonString(eqString));
}
if (subStringList.isEmpty() == false) {
BsonArray subList = new BsonArray();
for (int i = 0; i < fields.length; i++) {
BsonDocument sub = new BsonDocument();
sub.put(fields[i], new BsonDocument("$in", subStringList));
subList.add(sub);
}
BsonDocument subBase = new BsonDocument();
subBase.put("$or", subList);
return subBase;
}
return null;
}
static BsonDocument getRegexQueryObject(String field, String csv) {
String[] wdArr = csv.split(",");
BsonArray subPatternList = new BsonArray();
for (int i = 0; i < wdArr.length; i++) {
String wdString = wdArr[i].trim();
BsonDocument subRegex = new BsonDocument();
subRegex.put("$regex", new BsonRegularExpression("^" + wdString + ".*"));
subPatternList.add(new BsonDocument(field, subRegex));
}
BsonDocument subBase = new BsonDocument();
subBase.put("$or", subPatternList);
return subBase;
}
static Set<String> getWDList(Set<String> idSet, String id) {
MongoCollection<BsonDocument> collection = Configuration.mongoDatabase.getCollection("MasterData", BsonDocument.class);
// Invoke vocabulary query with EQ_name and includeChildren
BsonDocument vocObject = collection.find(new BsonDocument("id", new BsonString(id))).first();
idSet.add(id);
if (vocObject == null) {
return idSet;
}
BsonArray childObject = vocObject.get("children").asArray();
if (childObject != null) {
@SuppressWarnings("rawtypes")
Iterator childIter = childObject.iterator();
while (childIter.hasNext()) {
Object childObj = childIter.next();
if (childObj != null) {
idSet.add(childObj.toString());
}
}
}
return idSet;
}
static String encodeMongoObjectKey(String key) {
key = key.replace(".", "\uff0e");
return key;
}
static String decodeMongoObjectKey(String key) {
key = key.replace("\uff0e", ".");
return key;
}
static BsonValue converseType(String value) {
String[] valArr = value.split("\\^");
if (valArr.length != 2) {
return new BsonString(value);
}
try {
String type = valArr[1];
if (type.equals("int")) {
return new BsonInt32(Integer.parseInt(valArr[0]));
} else if (type.equals("long")) {
return new BsonInt64(Long.parseLong(valArr[0]));
} else if (type.equals("double")) {
return new BsonDouble(Double.parseDouble(valArr[0]));
} else if (type.equals("boolean")) {
return new BsonBoolean(Boolean.parseBoolean(valArr[0]));
} else {
return new BsonString(value);
}
} catch (NumberFormatException e) {
return new BsonString(value);
}
}
}