Слияние двух arraylists в простой форме польской записи

У меня есть два массива типа String, один из операндов и один из операторов

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

Они заполнены так

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

В идеале я бы преобразовал это в один ArrayList, который заполняется так

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

Было бы легко жестко закодировать польскую нотацию для трех элементов, но у меня есть различное количество операторов и операндов (до четырех операндов и трех операторов). Этот код должен использоваться для преобразования операторов выбора SQL в операторы MongoDB.find(). Любые указатели о том, как реализовать слияние ArrayList в польской нотации(префикс польской нотации) будет принята с благодарностью.

[Правка 2] Ниже приведен пример оператора SQL с 3 операторами ("лайк", "и", "<") и тремя операндами ("FLIR%", "цена", "цена") и его эквивалентом MongoDB. Я думаю, что использование польской нотации может помочь мне преобразовать порядок запроса SQL в моно-упорядоченный запрос

в SQL

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

в MongoDB

db.STOCK.find({
    "symbol": "FLIR%",
    "price": {
        "$gt": 24.04,
        "$lt": 24.39
    }
}

1 ответ

Решение

Если вы собираетесь написать такой синтаксический анализатор, то это будет довольно большой проект, потому что SQL-запрос может стать все более и более сложным. Вы можете попробовать использовать ANTLR. Он имеет грамматику sql. Или GeneralSqlParser или другой синтаксический анализатор для токенизации вашего оператора sql и последующего создания ваших операторов mongo.

Если вы не особенно заинтересованы в написании программы, вы можете положиться на проект Query Mongo. Он делает то, что вам нужно. Пожалуйста, обратитесь к этому сайту.

Тем не менее вы полны решимости получить быстрое решение для этого через Java, вы можете попробовать следующую программу. Он использует jsoup для отправки запроса на сайт querymongo и получения запроса mongo.

Надеюсь это поможет:)

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());
        }
    }
}
Другие вопросы по тегам