/** * Copyright (c) 2011-2014, OpenIoT * * This file is part of OpenIoT. * * OpenIoT is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, version 3 of the License. * * OpenIoT is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenIoT. If not, see <http://www.gnu.org/licenses/>. * * Contact: OpenIoT mailto: info@openiot.eu * @author Timotee Maret * @author Milos Stojanovic */ package org.openiot.gsn.http.datarequest; import org.apache.log4j.Logger; import java.util.ArrayList; public class AbstractQuery { //private StringBuilder standardQuery = null; private String[] fields; private LimitCriterion limitCriterion; private AggregationCriterion aggregation; private String vsName; private ArrayList<StandardCriterion> criteria; private static transient Logger logger = Logger.getLogger(AbstractQuery.class); public AbstractQuery (LimitCriterion limitCriterion, AggregationCriterion aggregation, String vsname, String[] fields, ArrayList<StandardCriterion> criteria) { //this.standardQuery = standardQuery; this.limitCriterion = limitCriterion; this.aggregation = aggregation; this.vsName = vsname; this.fields = fields; this.criteria = criteria; } public StringBuilder getStandardQuery() { // Standard Criteria StringBuilder partStandardCriteria = new StringBuilder () ; if (criteria != null) { StandardCriterion lastStandardCriterionLinkedToVs = null; StandardCriterion cc ; for (int i = 0 ; i < criteria.size() ; i++) { cc = criteria.get(i); if (cc.getVsname().compareTo("") == 0 || cc.getVsname().compareToIgnoreCase(vsName) == 0) { if (lastStandardCriterionLinkedToVs != null) { partStandardCriteria.append(lastStandardCriterionLinkedToVs.getCritJoin() + " " + cc.getNegation() + " " + cc.getField() + " " + cc.getOperator() + " "); } else { partStandardCriteria.append(cc.getNegation() + " " + cc.getField() + " " + cc.getOperator() + " "); } lastStandardCriterionLinkedToVs = cc; if (cc.getOperator().compareToIgnoreCase("like") == 0) partStandardCriteria.append("'%"); partStandardCriteria.append(cc.getValue()); if (cc.getOperator().compareToIgnoreCase("like") == 0) partStandardCriteria.append("%'"); partStandardCriteria.append(" "); } } if (lastStandardCriterionLinkedToVs != null) partStandardCriteria.insert(0, "where "); } StringBuilder partFields = new StringBuilder () ; for (int i = 0 ; i < fields.length ; i++) { if (partFields.length()>0) partFields.append(", "); if (aggregation != null) partFields.append(aggregation.getGroupOperator() + "("); partFields.append(fields[i]); if (aggregation != null) partFields.append(") as " + fields[i]); } if (aggregation != null) { if (partFields.length() > 0) { partFields.append(", "); } partFields.append("floor(timed/" + aggregation.getTimeRange() + ") as aggregation_interval "); } else partFields.append(" "); // Build a final query StringBuilder sqlQuery = new StringBuilder(); sqlQuery.append("select "); sqlQuery.append(partFields); sqlQuery.append("from ").append(vsName).append(" "); sqlQuery.append(partStandardCriteria); if (aggregation == null) sqlQuery.append("order by timed desc "); else sqlQuery.append("group by aggregation_interval desc "); logger.debug("SQL Query built >" + sqlQuery.toString() + "<"); return sqlQuery; } /*public void setStandardQuery(StringBuilder standardQuery) { this.standardQuery = standardQuery; }*/ public LimitCriterion getLimitCriterion() { return limitCriterion; } public void setLimitCriterion(LimitCriterion limitCriterion) { this.limitCriterion = limitCriterion; } public AggregationCriterion getAggregation() { return aggregation; } public void setAggregation(AggregationCriterion aggregation) { this.aggregation = aggregation; } public String getVsName() { return vsName; } public void setVsName(String vsName) { this.vsName = vsName; } public void updateCriterion(StandardCriterion criterion) { int index = criteria.indexOf(criterion); if (index != -1) { criteria.set(index, criterion); } else criteria.add(criterion); } public ArrayList<StandardCriterion> getCriteria() { return criteria; } public void setCriteria(ArrayList<StandardCriterion> criteria) { this.criteria = criteria; } public void addField(String fieldName) { String[] newFields = new String[fields.length + 1]; System.arraycopy(fields, 0, newFields, 1, fields.length); fields = newFields; fields[0] = fieldName; } public String[] getFields() { return fields; } public void setFields(String[] fields) { this.fields = fields; } }