/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package com.openbravo.data.loader; import com.mongodb.BasicDBObject; import com.mongodb.DBCollection; import com.mongodb.DBCursor; import com.mongodb.DBObject; import com.openbravo.basic.BasicException; import java.sql.Timestamp; import java.util.Iterator; import java.util.Map; import java.util.logging.Logger; /** * * @author TATIOTI-IDEAPAD */ public class MongoDBPreparedSentence extends MongoDBSentence { private static final Logger logger = Logger.getLogger("com.openbravo.data.loader.MongoDBPreparedSentence"); private String m_collectionName; private Map<Integer, String> m_writeParamColumnMap; private Map<Integer, String> m_readParamColumnMap; private BasicDBObject m_findDBObject = new BasicDBObject(); private BasicDBObject m_updateDBObject = new BasicDBObject(); private BasicDBObject m_insertDBObject = new BasicDBObject(); private boolean m_find = false; private boolean m_update = false; private boolean m_insert = false; private String m_sortColumn = ""; private String m_maxColumn = ""; private boolean m_countAll = false; private String[] m_lessThanColumn = null; private String[] m_greaterThanColumn = null; private String m_nullColumn = ""; private DBCursor m_dbCursor; protected SerializerRead m_SerRead = null; protected SerializerWrite m_SerWrite = null; public MongoDBPreparedSentence(Session s, String collectionName, Map<Integer, String> writeParamColumnMap, Map<Integer, String> readParamColumnMap, SerializerWrite serWrite, SerializerRead serRead) { super(s); m_SerRead = serRead; m_SerWrite = serWrite; m_collectionName = collectionName; m_writeParamColumnMap = writeParamColumnMap; m_readParamColumnMap = readParamColumnMap; m_find = true; } public MongoDBPreparedSentence(Session s, String collectionName, Map<Integer, String> writeParamColumnMap, Map<Integer, String> readParamColumnMap, SerializerRead serRead) { super(s); m_SerRead = serRead; m_collectionName = collectionName; m_writeParamColumnMap = writeParamColumnMap; m_readParamColumnMap = readParamColumnMap; m_find = true; } public MongoDBPreparedSentence(Session s, String collectionName, Map<Integer, String> writeParamColumnMap, Map<Integer, String> readParamColumnMap, BasicDBObject findObject, SerializerWrite serWrite, SerializerRead serRead) { super(s); m_SerWrite = serWrite; m_SerRead = serRead; m_writeParamColumnMap = writeParamColumnMap; m_readParamColumnMap = readParamColumnMap; m_find = true; m_findDBObject = findObject; } public MongoDBPreparedSentence(Session s, String collectionName, Map<Integer, String> readParamMap, BasicDBObject findObject, SerializerRead serRead) { super(s); m_SerRead = serRead; m_collectionName = collectionName; m_readParamColumnMap = readParamMap; m_find = true; m_findDBObject = findObject; } public MongoDBPreparedSentence(Session s, String collectionName, Map<Integer, String> readParamMap, SerializerRead serRead) { super(s); m_SerRead = serRead; m_collectionName = collectionName; m_readParamColumnMap = readParamMap; m_find = true; } public MongoDBPreparedSentence(Session s, String collectionName, Map<Integer, String> writeParamMap, SerializerWrite serWrite, boolean insert) { super(s); m_collectionName = collectionName; m_writeParamColumnMap = writeParamMap; m_SerWrite = serWrite; if (insert) m_insert = true; else m_update = true; } public MongoDBPreparedSentence setSortColumn(String sortColumn) { this.m_sortColumn = sortColumn; return this; } public MongoDBPreparedSentence setMaxColumn(String maxColumn) { this.m_maxColumn = maxColumn; return this; } public MongoDBPreparedSentence setCountAll(boolean bool) { this.m_countAll = bool; return this; } public MongoDBPreparedSentence setNullColumn(String nullColumn) { this.m_nullColumn = nullColumn; return this; } public MongoDBPreparedSentence setLessThanColumn(String[] lessThanColumn) { this.m_lessThanColumn = lessThanColumn; return this; } public MongoDBPreparedSentence setGreaterThanColumn(String[] greaterThanColumn) { this.m_greaterThanColumn = greaterThanColumn; return this; } private static final class MongoDBPreparedSentencePars implements DataWrite { private Map<Integer, String> m_writeParamColumnMap; private BasicDBObject m_dbObject; /** Creates a new instance of SQLParameter */ MongoDBPreparedSentencePars(BasicDBObject dbObject, Map<Integer, String> paramColumnMap) { m_writeParamColumnMap = paramColumnMap; m_dbObject = dbObject; } @Override public void setInt(int paramIndex, Integer iValue) throws BasicException { m_dbObject.append(m_writeParamColumnMap.get(paramIndex), iValue); } @Override public void setString(int paramIndex, String sValue) throws BasicException { m_dbObject.append(m_writeParamColumnMap.get(paramIndex), sValue); } @Override public void setDouble(int paramIndex, Double dValue) throws BasicException { m_dbObject.append(m_writeParamColumnMap.get(paramIndex), dValue); } @Override public void setBoolean(int paramIndex, Boolean bValue) throws BasicException { if (bValue != null) { m_dbObject.append(m_writeParamColumnMap.get(paramIndex), bValue); } } @Override public void setTimestamp(int paramIndex, java.util.Date dValue) throws BasicException { if (dValue != null) { m_dbObject.append(m_writeParamColumnMap.get(paramIndex), new Timestamp(dValue.getTime())); } } // public void setBinaryStream(int paramIndex, java.io.InputStream in, int length) throws DataException { // try { // m_ps.setBinaryStream(paramIndex, in, length); // } catch (SQLException eSQL) { // throw new DataException(eSQL); // } // } @Override public void setBytes(int paramIndex, byte[] value) throws BasicException { m_dbObject.append(m_writeParamColumnMap.get(paramIndex), value); } @Override public void setObject(int paramIndex, Object value) throws BasicException { m_dbObject.append(m_writeParamColumnMap.get(paramIndex), value); } } @Override public DataResultSet openExec(Object params) throws BasicException { closeExec(); DBCollection collection = m_s.getMongoDBDatabase().getCollection(m_collectionName); if (m_SerWrite != null) { if (m_insert) m_SerWrite.writeValues(new MongoDBPreparedSentencePars(m_insertDBObject, m_writeParamColumnMap), params); else if (m_find) m_SerWrite.writeValues(new MongoDBPreparedSentencePars(m_findDBObject, m_writeParamColumnMap), params); else if (m_update) m_SerWrite.writeValues(new MongoDBPreparedSentencePars(m_updateDBObject, m_writeParamColumnMap), params); } if (!m_nullColumn.isEmpty()) m_findDBObject.append(m_nullColumn, new BasicDBObject("$exists", true)); if (m_lessThanColumn != null) { for (int i = 0; i < m_lessThanColumn.length; ++i) { Object lessThanValue = m_findDBObject.get(m_lessThanColumn[i]); m_findDBObject.removeField(m_lessThanColumn[i]); m_findDBObject.append(m_lessThanColumn[i], new BasicDBObject("$lt", lessThanValue)); } } if (m_greaterThanColumn != null) { for (int i = 0; i < m_greaterThanColumn.length; ++i) { Object greaterThanValue = m_findDBObject.get(m_greaterThanColumn[i]); m_findDBObject.removeField(m_greaterThanColumn[i]); m_findDBObject.append(m_greaterThanColumn[i], new BasicDBObject("$gt", greaterThanValue)); } } // Insert statement if (m_insert) { collection.insert(m_insertDBObject); } else if (m_find) { if (!m_sortColumn.isEmpty()) { m_dbCursor = collection.find(m_findDBObject).sort(new BasicDBObject(m_sortColumn, 1)); return new MongoDBDataResultSet(m_dbCursor, m_readParamColumnMap, m_SerRead); } if (!m_maxColumn.isEmpty()) { Iterator<DBObject> it = collection.aggregate(new BasicDBObject("$match", m_findDBObject), new BasicDBObject("$group", new BasicDBObject("_id", "null").append("MAX", new BasicDBObject("$max", "$" + m_maxColumn)))).results().iterator(); //Iterator<DBObject> it = collection.aggregate(new BasicDBObject("$group", new BasicDBObject("_id", "null").append("MAX", new BasicDBObject("$max", "$" + m_maxColumn)))).results().iterator(); DBObject maxObject = new BasicDBObject(); if (it.hasNext()) maxObject = it.next(); return new MongoDBDataResultSet(maxObject, m_readParamColumnMap, m_SerRead); } if (m_countAll) { Iterator<DBObject> it = collection.aggregate(new BasicDBObject("$match", m_findDBObject), new BasicDBObject("$group", new BasicDBObject("_id", "null").append("COUNT", new BasicDBObject("$sum", 1)))).results().iterator(); //Iterator<DBObject> it = collection.aggregate(new BasicDBObject("$group", new BasicDBObject("_id", "null").append("MAX", new BasicDBObject("$max", "$" + m_maxColumn)))).results().iterator(); DBObject maxObject = new BasicDBObject(); if (it.hasNext()) maxObject = it.next(); return new MongoDBDataResultSet(maxObject, m_readParamColumnMap, m_SerRead); } m_dbCursor = collection.find(m_findDBObject); return new MongoDBDataResultSet(m_dbCursor, m_readParamColumnMap, m_SerRead); } else if (m_update) { String findKey = ((String)m_writeParamColumnMap.get((Integer)m_writeParamColumnMap.keySet().toArray()[m_writeParamColumnMap.size() - 1])); String key = findKey.replace('s', ' ').trim(); m_findDBObject.append(key, m_updateDBObject.get(findKey)); // Remove the find criteria in the update object m_updateDBObject.remove(m_writeParamColumnMap.get((Integer)m_writeParamColumnMap.keySet().toArray()[m_writeParamColumnMap.size() - 1])); collection.findAndModify(m_findDBObject, null, null, true, m_updateDBObject, true, true); return new SentenceUpdateResultSet(0); } return null; } @Override public DataResultSet moreResults() throws BasicException { return new MongoDBDataResultSet(m_dbCursor, m_readParamColumnMap, m_SerRead); } @Override public void closeExec() throws BasicException { if (m_dbCursor != null) m_dbCursor.close(); } }