Слияние двух 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());
}
}
}