7

I have two arraylists of type String, one of Operands and one of Operators

ArrayList<String> operands = new ArrayList<String>();
ArrayList<String> operators = new ArrayList<String>();

They are filled like so

operands = { "\"symbol\": \"CHKP%\"", "\"price\": {$gt: 23.72\" };
operators = { "and"};

Ideally I would convert this to a single ArrayList that is filled like so

ArrayList<String> polishNotation = { "and", 
                   "\"symbol\": \"CHKP%\"", 
                   "\"price\": {$gt: 23.72\" };

It would be easy to hardcode Polish Notation for three elements, but I have varying numbers of operators and operands (up to four operands and three operators). This code is to be used to convert SQL select statements to MongoDB.find() statements. Any pointers on how to implement the ArrayList merge in Polish Notation(prefix polish notation) would be much appreciated.

[Edit 2] Below is an example of an SQL statement with 3 operators ("like", "and", "<") and three operands ('FLIR%', "price", "price") and it's MongoDB equivalent. I think using Polish Notation can help me convert SQL's order of the query into a Mongo-ordered query

in SQL

SELECT * FROM STOCK WHERE symbol like 'FLIR%' and price > 24.04 and price < 24.39;

in MongoDB

db.STOCK.find({
    "symbol": "FLIR%",
    "price": {
        "$gt": 24.04,
        "$lt": 24.39
    }
}
Kyte
  • 834
  • 2
  • 12
  • 27
  • I see the possible language issue here, but it really is not clear what result you want to achieve here. Perhaps show your input data and your expected result in your question. – Neil Lunn May 14 '14 at 13:44
  • The edit should explain it a more clearly. Let me know if you need anything else – Kyte May 14 '14 at 13:50

1 Answers1

4

If you are going to write a parser like this it is going to a fairly big project because the sql query could get more and more complex. You could try using ANTLR. It has an sql grammar. Or GeneralSqlParser or other parser to tokenize your sql statement an then construct your mongo statements.

If you are not particular about writing a program you can rely on the Query Mongo project. It does what you need. Please refer to that site.

Still you are determined to get a quick solution for this via Java, you can try the below program. This uses jsoup to submit you query to the querymongo site and retrieve the mongo query.

Hope this helps :)

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;

public class MongoQuery {

    public static void main(String[] args) throws Exception {

        System.setProperty("http.proxyHost", "10.9.248.37");
        System.setProperty("http.proxyPort", "18082");

        Document doc = Jsoup.connect("http://www.querymongo.com/")
                .data("MySQLQuery", "SELECT * FROM STOCK WHERE symbol like 'FLIR%' and price > 24.04 and price < 24.39")
                .post();

        for(Element e : doc.select("#mongoQuery")){
            System.out.println(e.val());
        }
    }
}
Syam S
  • 8,421
  • 1
  • 26
  • 36
  • edited per your request, please let me know if I need to clarify further – Kyte May 14 '14 at 14:56
  • Oops.. I Didn't mean that. I was expecting an update to the arraylist. So are you generating a list of operands and operators from sql query? or do you want the program to accept the string query and generate a polish notation? – Syam S May 14 '14 at 15:10
  • I'm taking sql queries as input. The goal is to break them apart into sub-sections that are easier to work with, convert those to mongodb sub-sections, and put it all back together in the order that mongodb requires. Does that help? – Kyte May 14 '14 at 15:17