package org.genedb.query.parsing;
import org.genedb.query.QueryI;
import org.genedb.query.QueryStringParser;
import java.util.Map;
import java.util.Stack;
/**
*
* It parsers queries of the form:
* queryname[querycontext]{{param1=val1}{param2=val2}} SET_OP (... e.g.
* queryname[species=pombe]{{min=3}{max=7}}
*
* @author art
*
*/
public class BasicQueryStringParser implements QueryStringParser {
private enum ParseState {
QUERY_NAME, CONTEXT, POST_CONTEXT, PARAMSET, PARAM, OUTSIDE, OPERATOR;
}
private enum Token {
LEFT_PAREN, RIGHT_PAREN;
}
private class StackItem {
private Token token;
private Object data;
}
public ParsedElement parseOneQueryInString(String queryString, Stack stack) {
queryString = queryString.trim();
int pos = 0;
ParsedElement ret = new ParsedElement();
String context;
String paramPairs;
StringBuffer acc = new StringBuffer();
ParseState state = ParseState.QUERY_NAME;
while ((pos < queryString.length()) && (state != ParseState.OUTSIDE)) {
char c = queryString.charAt(pos);
switch (c) {
case '(':
if (state == ParseState.OUTSIDE) {
stack.push(Token.LEFT_PAREN);
break;
} else {
acc.append(c);
}
break;
case ')':
if (state == ParseState.OUTSIDE) {
stack.push(Token.RIGHT_PAREN);
break;
} else {
acc.append(c);
}
break;
case '[':
if (state == ParseState.QUERY_NAME) {
ret.setQueryName(acc.toString());
acc.setLength(0);
state = ParseState.CONTEXT;
} else {
acc.append(c);
}
break;
case ']':
if (state == ParseState.CONTEXT) {
context = acc.toString();
acc.setLength(0);
state = ParseState.POST_CONTEXT;
} else {
acc.append(c);
}
break;
case '{':
switch (state) {
case POST_CONTEXT:
state = ParseState.PARAMSET;
break;
default:
acc.append(c);
break;
}
case '}':
switch (state) {
case PARAMSET:
state = ParseState.OUTSIDE;
break;
case PARAM:
state = ParseState.PARAMSET;
default:
acc.append(c);
break;
}
case ' ':
switch (state) {
case PARAMSET:
break; // Ignore white space between param pairs
default:
acc.append(c);
break;
}
default:
acc.append(c);
}
}
if (pos < queryString.length() - 1) {
ret.remainder = queryString.substring(pos);
}
return ret;
}
/**
* @see org.genedb.zoe.query.QueryStringParser#parseQueryString(java.lang.String)
*/
public QueryI parseQueryString(String queryString) {
// TODO Auto-generated method stub
return null;
}
private class ParsedElement {
private String queryName;
private Map context;
private Map params;
private String remainder;
public Map getContext() {
return this.context;
}
public void setContext(Map context) {
this.context = context;
}
public Map getParams() {
return this.params;
}
public void setParams(Map params) {
this.params = params;
}
public String getQueryName() {
return this.queryName;
}
public void setQueryName(String queryName) {
this.queryName = queryName;
}
public String getRemainder() {
return this.remainder;
}
public void setRemainder(String remainder) {
this.remainder = remainder;
}
}
}