package com.apigee.sdk.data.client.entities; import android.net.Uri; import java.util.ArrayList; import java.util.Map; import java.util.Set; /** * Created by ApigeeCorporation on 8/21/14. */ public class ApigeeQuery { public enum RelationalOperator { kApigeeQueryOperationEquals, kApigeeQueryOperationLessThan, kApigeeQueryOperationLessThanOrEqualTo, kApigeeQueryOperationGreaterThan, kApigeeQueryOperationGreaterThanOrEqualTo }; private String urlTerms = ""; private ArrayList<String> requirements = new ArrayList<String>(); public ApigeeQuery() { } public ApigeeQuery(Map<String,Object> dictParams) { if( dictParams != null ) { Set<String> paramKeys = dictParams.keySet(); for( String paramKey : paramKeys) { if( !paramKey.equalsIgnoreCase("type") ) { Object value = dictParams.get(paramKey); if( value instanceof Number ) { Number valueAsNumber = (Number)value; this.addRequiredOperation(paramKey,RelationalOperator.kApigeeQueryOperationEquals,valueAsNumber.intValue()); } else if( value instanceof String ) { String valueAsString = (String)value; this.addRequiredOperation(paramKey,RelationalOperator.kApigeeQueryOperationEquals,valueAsString); } else { // TODO: add log message indicating that the key is not being used to construct the query } } } } } private static String relationalOperatorToString(RelationalOperator relationalOperator) { String relationalOperatorAsString = null; switch(relationalOperator) { case kApigeeQueryOperationEquals:{ relationalOperatorAsString = "="; break; } case kApigeeQueryOperationGreaterThan:{ relationalOperatorAsString = ">"; break; } case kApigeeQueryOperationGreaterThanOrEqualTo:{ relationalOperatorAsString = ">="; break; } case kApigeeQueryOperationLessThan:{ relationalOperatorAsString = "<"; break; } case kApigeeQueryOperationLessThanOrEqualTo:{ relationalOperatorAsString = "<="; break; } } return relationalOperatorAsString; } public void setConsumer(String consumer) { this.addURLTerm("consumer",consumer); } public void setLastUUID(String UUID) { this.addURLTerm("last",UUID); } public void setTime(Long time) { this.addURLTerm("time",time.toString()); } public void setPrev(int prev) { this.addURLTerm("prev",Integer.toString(prev)); } public void setNext(int next) { this.addURLTerm("next",Integer.toString(next)); } public void setLimit(int limit) { this.addURLTerm("limit",Integer.toString(limit)); } public void setPos(String pos) { this.addURLTerm("pos",pos); } public void setUpdate(Boolean update) { this.addURLTerm("update",update.toString()); } public void setSynch(Boolean synch) { this.addURLTerm("synchronized",synch.toString()); } public void addRequirement(String requirement) { if( requirement != null ) { this.requirements.add(requirement); } } public void addRequiredOperation(String term, RelationalOperator relationalOperator, int valueInt) { if( term != null ) { String relationalOperatorAsString = relationalOperatorToString(relationalOperator); if( relationalOperatorAsString != null ) { String assembledRequirement = term + " " + relationalOperatorAsString + " " + valueInt; this.addRequirement(assembledRequirement); } } } public void addRequiredOperation(String term, RelationalOperator relationalOperator, String valueString) { if( term != null && valueString != null ) { String relationalOperatorAsString = relationalOperatorToString(relationalOperator); if( relationalOperatorAsString != null ) { if( term.equalsIgnoreCase("cursor") || term.equalsIgnoreCase("limit") ) { this.addURLTerm(term,valueString); } else if( term.equalsIgnoreCase("ql") ) { this.addRequirement(valueString); } else { String assembledRequirement = term + relationalOperatorAsString + "'" + valueString + "'"; this.addRequirement(assembledRequirement); } } } } public void addURLTerm(String urlTerm, String equals) { if( urlTerm != null && equals != null ) { if( urlTerm.equalsIgnoreCase("ql") ) { this.addRequirement(equals); } else { if( !urlTerms.isEmpty() ) { urlTerms += "&"; } String escapedURLTerm = Uri.encode(urlTerm); String escapedEquals = Uri.encode(equals); urlTerms += escapedURLTerm + "=" + escapedEquals; } } } public void addRequiredContains(String term, String value) { if( term != null && value != null ) { String assembledRequirement = term; assembledRequirement += " contains "; assembledRequirement += "'" + value + "'"; this.addRequirement(assembledRequirement); } } public void addRequiredIn(String term, int low, int high) { if( term != null ) { String assembledRequirement = term; assembledRequirement += " in "; assembledRequirement += Integer.toString(low) + "," + Integer.toString(high); this.addRequirement(assembledRequirement); } } public void addRequiredWithin(String term, float latitude, float longitude, float distance) { if( term != null ) { String assembledRequirement = term; assembledRequirement += " within "; assembledRequirement += Float.toString(distance) + " of " + Float.toString(latitude) + "," + Float.toString(longitude); this.addRequirement(assembledRequirement); } } public String getURLAppend() { // assemble a url append for all the requirements String assembledURL = ""; // start with the ql term if( this.requirements.size() > 0 ) { String qlString = ""; for( int i = 0; i < this.requirements.size(); i++ ) { if( i > 0 && !qlString.isEmpty() ) { qlString += " and "; } qlString += requirements.get(i); } String escapedQLString = Uri.encode(qlString); assembledURL += "ql=" + escapedQLString; } if( !this.urlTerms.isEmpty() ) { if( assembledURL.isEmpty() ) { assembledURL += this.urlTerms; } else { assembledURL += "&" + this.urlTerms; } } return assembledURL; } }