/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.eagle.query.parser.test;

import org.apache.eagle.query.parser.*;
import org.junit.Assert;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class TestEagleQueryParser {

    private static final Logger LOG = LoggerFactory.getLogger(TestEagleQueryParser.class);

    @Test
    public void testSingleExpression() {
        String query = "@cluster=\"a\"";
        EagleQueryParser parser = new EagleQueryParser(query);
        ORExpression or = null;
        try {
            or = parser.parse();
        } catch (EagleQueryParseException ex) {
            Assert.fail(ex.getMessage());
        }
        Assert.assertTrue(or.getANDExprList().size() == 1);
        Assert.assertEquals(1, or.getANDExprList().get(0).getAtomicExprList().size());
        Assert.assertEquals("@cluster", or.getANDExprList().get(0).getAtomicExprList().get(0).getKey());
        Assert.assertEquals("a", or.getANDExprList().get(0).getAtomicExprList().get(0).getValue());
        Assert.assertEquals("=", or.getANDExprList().get(0).getAtomicExprList().get(0).getOp().toString());
        LOG.info(or.toString());
        Assert.assertEquals("(@cluster=\"a\")", or.toString());
    }

    @Test
    public void testLessThanExpression() {
        String query = "@field1<\"1\"";
        EagleQueryParser parser = new EagleQueryParser(query);
        ORExpression or = null;
        try {
            or = parser.parse();
        } catch (EagleQueryParseException ex) {
            Assert.fail(ex.getMessage());
        }
        Assert.assertTrue(or.getANDExprList().size() == 1);
        Assert.assertEquals(1, or.getANDExprList().get(0).getAtomicExprList().size());
        Assert.assertEquals("@field1", or.getANDExprList().get(0).getAtomicExprList().get(0).getKey());
        Assert.assertEquals("1", or.getANDExprList().get(0).getAtomicExprList().get(0).getValue());
        Assert.assertEquals("<", or.getANDExprList().get(0).getAtomicExprList().get(0).getOp().toString());
        LOG.info(or.toString());
        Assert.assertEquals("(@field1<\"1\")", or.toString());
    }

    @Test
    public void testLessOrEqualExpression() {
        String query = "@field1<=\"1\"";
        EagleQueryParser parser = new EagleQueryParser(query);
        ORExpression or = null;
        try {
            or = parser.parse();
        } catch (EagleQueryParseException ex) {
            Assert.fail(ex.getMessage());
        }
        Assert.assertTrue(or.getANDExprList().size() == 1);
        Assert.assertEquals(1, or.getANDExprList().get(0).getAtomicExprList().size());
        Assert.assertEquals("@field1", or.getANDExprList().get(0).getAtomicExprList().get(0).getKey());
        Assert.assertEquals("1", or.getANDExprList().get(0).getAtomicExprList().get(0).getValue());
        Assert.assertEquals("<=", or.getANDExprList().get(0).getAtomicExprList().get(0).getOp().toString());
        LOG.info(or.toString());
        Assert.assertEquals("(@field1<=\"1\")", or.toString());
    }

    @Test
    public void testGreaterThanExpression() {
        String query = "@field1>\"1\"";
        EagleQueryParser parser = new EagleQueryParser(query);
        ORExpression or = null;
        try {
            or = parser.parse();
        } catch (EagleQueryParseException ex) {
            Assert.fail(ex.getMessage());
        }
        Assert.assertTrue(or.getANDExprList().size() == 1);
        Assert.assertEquals(1, or.getANDExprList().get(0).getAtomicExprList().size());
        Assert.assertEquals("@field1", or.getANDExprList().get(0).getAtomicExprList().get(0).getKey());
        Assert.assertEquals("1", or.getANDExprList().get(0).getAtomicExprList().get(0).getValue());
        Assert.assertEquals(">", or.getANDExprList().get(0).getAtomicExprList().get(0).getOp().toString());
        LOG.info(or.toString());
        Assert.assertEquals("(@field1>\"1\")", or.toString());
    }

    @Test
    public void testGreaterOrEqualExpression() {
        String query = "@field1>=\"1\"";
        EagleQueryParser parser = new EagleQueryParser(query);
        ORExpression or = null;
        try {
            or = parser.parse();
        } catch (EagleQueryParseException ex) {
            Assert.fail(ex.getMessage());
        }
        Assert.assertTrue(or.getANDExprList().size() == 1);
        Assert.assertEquals(1, or.getANDExprList().get(0).getAtomicExprList().size());
        Assert.assertEquals("@field1", or.getANDExprList().get(0).getAtomicExprList().get(0).getKey());
        Assert.assertEquals("1", or.getANDExprList().get(0).getAtomicExprList().get(0).getValue());
        Assert.assertEquals(">=", or.getANDExprList().get(0).getAtomicExprList().get(0).getOp().toString());
        Assert.assertEquals(TokenType.STRING, or.getANDExprList().get(0).getAtomicExprList().get(0).getValueType());

        LOG.info(or.toString());
        Assert.assertEquals("(@field1>=\"1\")", or.toString());
    }

    @Test
    public void testMultipleANDExpression() {
        String query = "@cluster=\"abc\" AND @host=\"dc123.xyz.com\"";
        EagleQueryParser parser = new EagleQueryParser(query);
        ORExpression or = null;
        try {
            or = parser.parse();
        } catch (EagleQueryParseException ex) {
            Assert.fail(ex.getMessage());
        }
        Assert.assertTrue(or.getANDExprList().size() == 1);
        Assert.assertEquals(2, or.getANDExprList().get(0).getAtomicExprList().size());
        Assert.assertEquals("@cluster", or.getANDExprList().get(0).getAtomicExprList().get(0).getKey());
        Assert.assertEquals("abc", or.getANDExprList().get(0).getAtomicExprList().get(0).getValue());
        Assert.assertEquals(TokenType.STRING, or.getANDExprList().get(0).getAtomicExprList().get(0).getValueType());
        Assert.assertEquals("=", or.getANDExprList().get(0).getAtomicExprList().get(0).getOp().toString());
        Assert.assertEquals("@host", or.getANDExprList().get(0).getAtomicExprList().get(1).getKey());
        Assert.assertEquals("dc123.xyz.com", or.getANDExprList().get(0).getAtomicExprList().get(1).getValue());
        Assert.assertEquals(TokenType.STRING, or.getANDExprList().get(0).getAtomicExprList().get(1).getValueType());
        Assert.assertEquals("=", or.getANDExprList().get(0).getAtomicExprList().get(1).getOp().toString());
        LOG.info(or.toString());
        Assert.assertEquals("(@cluster=\"abc\" AND @host=\"dc123.xyz.com\")", or.toString());

        query = "@datacenter=\"dc1\" AND @cluster=\"abc\" AND @host=\"dc123.xyz.com\" ";
        parser = new EagleQueryParser(query);
        try {
            or = parser.parse();
        } catch (EagleQueryParseException ex) {
            Assert.fail(ex.getMessage());
        }
        Assert.assertTrue(or.getANDExprList().size() == 1);
        Assert.assertEquals(3, or.getANDExprList().get(0).getAtomicExprList().size());
        Assert.assertEquals("@datacenter", or.getANDExprList().get(0).getAtomicExprList().get(0).getKey());
        Assert.assertEquals("dc1", or.getANDExprList().get(0).getAtomicExprList().get(0).getValue());
        Assert.assertEquals("=", or.getANDExprList().get(0).getAtomicExprList().get(0).getOp().toString());
        Assert.assertEquals("@cluster", or.getANDExprList().get(0).getAtomicExprList().get(1).getKey());
        Assert.assertEquals("abc", or.getANDExprList().get(0).getAtomicExprList().get(1).getValue());
        Assert.assertEquals("=", or.getANDExprList().get(0).getAtomicExprList().get(1).getOp().toString());
        Assert.assertEquals("@host", or.getANDExprList().get(0).getAtomicExprList().get(2).getKey());
        Assert.assertEquals("dc123.xyz.com", or.getANDExprList().get(0).getAtomicExprList().get(2).getValue());
        Assert.assertEquals("=", or.getANDExprList().get(0).getAtomicExprList().get(2).getOp().toString());
        LOG.info(or.toString());
        Assert.assertEquals("(@datacenter=\"dc1\" AND @cluster=\"abc\" AND @host=\"dc123.xyz.com\")", or.toString());
    }

    @Test
    public void testMultipleORExpression() {
        String query = "@cluster=\"abc\" OR @host=\"dc123.xyz.com\"";
        EagleQueryParser parser = new EagleQueryParser(query);
        ORExpression or = null;
        try {
            or = parser.parse();
        } catch (EagleQueryParseException ex) {
            Assert.fail(ex.getMessage());
        }
        Assert.assertTrue(or.getANDExprList().size()==2);
        Assert.assertEquals(1, or.getANDExprList().get(0).getAtomicExprList().size());
        Assert.assertEquals(1, or.getANDExprList().get(1).getAtomicExprList().size());
        Assert.assertEquals("@cluster", or.getANDExprList().get(0).getAtomicExprList().get(0).getKey());
        Assert.assertEquals("abc", or.getANDExprList().get(0).getAtomicExprList().get(0).getValue());
        Assert.assertEquals("=", or.getANDExprList().get(0).getAtomicExprList().get(0).getOp().toString());
        Assert.assertEquals("@host", or.getANDExprList().get(1).getAtomicExprList().get(0).getKey());
        Assert.assertEquals("dc123.xyz.com", or.getANDExprList().get(1).getAtomicExprList().get(0).getValue());
        Assert.assertEquals("=", or.getANDExprList().get(1).getAtomicExprList().get(0).getOp().toString());
        Assert.assertEquals("(@cluster=\"abc\") OR (@host=\"dc123.xyz.com\")", or.toString());

        query = "@datacenter=\"dc1\" OR @cluster=\"abc\" OR @host=\"dc123.xyz.com\"";
        parser = new EagleQueryParser(query);
        or = null;
        try {
            or = parser.parse();
        } catch (EagleQueryParseException ex) {
            Assert.fail(ex.getMessage());
        }		Assert.assertTrue(or.getANDExprList().size()==3);
        Assert.assertEquals(1, or.getANDExprList().get(0).getAtomicExprList().size());
        Assert.assertEquals(1, or.getANDExprList().get(1).getAtomicExprList().size());
        Assert.assertEquals(1, or.getANDExprList().get(2).getAtomicExprList().size());
        Assert.assertEquals("@datacenter", or.getANDExprList().get(0).getAtomicExprList().get(0).getKey());
        Assert.assertEquals("dc1", or.getANDExprList().get(0).getAtomicExprList().get(0).getValue());
        Assert.assertEquals("=", or.getANDExprList().get(0).getAtomicExprList().get(0).getOp().toString());
        Assert.assertEquals("@cluster", or.getANDExprList().get(1).getAtomicExprList().get(0).getKey());
        Assert.assertEquals("abc", or.getANDExprList().get(1).getAtomicExprList().get(0).getValue());
        Assert.assertEquals("=", or.getANDExprList().get(1).getAtomicExprList().get(0).getOp().toString());
        Assert.assertEquals("@host", or.getANDExprList().get(2).getAtomicExprList().get(0).getKey());
        Assert.assertEquals("dc123.xyz.com", or.getANDExprList().get(2).getAtomicExprList().get(0).getValue());
        Assert.assertEquals("=", or.getANDExprList().get(2).getAtomicExprList().get(0).getOp().toString());
        Assert.assertEquals("(@datacenter=\"dc1\") OR (@cluster=\"abc\") OR (@host=\"dc123.xyz.com\")", or.toString());
    }

    @Test
    public void testANDORCombination() {
        String query = "@cluster=\"abc\" OR @host=\"dc123.xyz.com\" AND @datacenter=\"dc1\"";
        EagleQueryParser parser = new EagleQueryParser(query);
        ORExpression or = null;
        try {
            or = parser.parse();
        } catch (EagleQueryParseException ex) {
            Assert.fail(ex.getMessage());
        }		LOG.info(or.toString());
        Assert.assertEquals("(@cluster=\"abc\") OR (@host=\"dc123.xyz.com\" AND @datacenter=\"dc1\")", or.toString());

        query = "(@cluster=\"abc\" AND @host=\"dc123.xyz.com\") AND @datacenter=\"dc1\"";
        parser = new EagleQueryParser(query);
        or = null;
        try {
            or = parser.parse();
        } catch (EagleQueryParseException ex) {
            Assert.fail(ex.getMessage());
        }		LOG.info(or.toString());
        Assert.assertEquals("(@cluster=\"abc\" AND @host=\"dc123.xyz.com\" AND @datacenter=\"dc1\")", or.toString());

        query = "(@cluster=\"abc\" OR @host=\"dc123.xyz.com\") AND @datacenter=\"dc1\"";
        parser = new EagleQueryParser(query);
        or = null;
        try {
            or = parser.parse();
        } catch (EagleQueryParseException ex) {
            Assert.fail(ex.getMessage());
        }
        LOG.info(or.toString());
        Assert.assertEquals("(@cluster=\"abc\" AND @datacenter=\"dc1\") OR (@host=\"dc123.xyz.com\" AND @datacenter=\"dc1\")", or.toString());

        query = "(@cluster=\"abc\" OR @host=\"dc123.xyz.com\") AND (@datacenter=\"dc1\" OR @cluster=\"bcd\")";
        parser = new EagleQueryParser(query);
        or = null;
        try {
            or = parser.parse();
        } catch (EagleQueryParseException ex) {
            Assert.fail(ex.getMessage());
        }
        LOG.info(or.toString());
        Assert.assertEquals("(@cluster=\"abc\" AND @datacenter=\"dc1\") OR (@cluster=\"abc\" AND @cluster=\"bcd\") OR (@host=\"dc123.xyz.com\" AND @datacenter=\"dc1\") OR (@host=\"dc123.xyz.com\" AND @cluster=\"bcd\")", or.toString());

        query = "(@cluster=\"abc\" OR @host=\"dc123.xyz.com\") AND (@datacenter=\"dc1\" AND @cluster=\"bcd\")";
        parser = new EagleQueryParser(query);
        or = null;
        try {
            or = parser.parse();
        } catch (EagleQueryParseException ex) {
            Assert.fail(ex.getMessage());
        }
        LOG.info(or.toString());
        Assert.assertEquals("(@cluster=\"abc\" AND @datacenter=\"dc1\" AND @cluster=\"bcd\") OR (@host=\"dc123.xyz.com\" AND @datacenter=\"dc1\" AND @cluster=\"bcd\")", or.toString());
    }

    @Test
    public void testNegativeCase() {
        String query = "@cluster      = \"a\"";
        EagleQueryParser parser = new EagleQueryParser(query);
        ORExpression or = null;
        try {
            or = parser.parse();
        } catch (EagleQueryParseException ex) {
            Assert.fail(ex.getMessage());
        }
        LOG.info(or.toString());
        Assert.assertEquals("(@cluster=\"a\")", or.toString());

        query = "@cluster    = a\"";
        parser = new EagleQueryParser(query);
        or = null;
        try {
            or = parser.parse();
        } catch (Exception ex) {
            LOG.error("Can not successfully parse the query:" + query, ex);
        }
        Assert.assertTrue(or == null);

        query = "@cluster    = \"\"a\"";
        parser = new EagleQueryParser(query);
        or = null;
        try {
            or = parser.parse();
        } catch (Exception ex) {
            LOG.error("Can not successfully parse the query:" + query, ex);
        }
        Assert.assertNotNull(or);

        query = "@cluster=\"cluster1\" AND @datacenter=\"dc1\" AND @remediationID=8888\" AND @remediationStatus=\"status\"";
        parser = new EagleQueryParser(query);
        or = null;
        try {
            or = parser.parse();
        } catch (Exception ex) {
            LOG.error("Can not successfully parse the query:" + query, ex);
        }
        Assert.assertTrue(or == null);
    }

    @Test
    public void testSimpleWildcardMatchQuery() {
        String expected = "-[]/{}()*+?.\\^$|";
        String query = "@user=\"-[]/{}()*+?.\\\\^$|\"";
        System.out.println(query);
        EagleQueryParser parser = new EagleQueryParser(query);
        ORExpression or = null;
        try {
            or = parser.parse();
        } catch (EagleQueryParseException ex) {
            Assert.fail(ex.getMessage());
        }
        Assert.assertTrue(or.getANDExprList().size() == 1);
        Assert.assertEquals(1, or.getANDExprList().get(0).getAtomicExprList().size());
        Assert.assertEquals("@user", or.getANDExprList().get(0).getAtomicExprList().get(0).getKey());
        Assert.assertEquals(expected, or.getANDExprList().get(0).getAtomicExprList().get(0).getValue());
        Assert.assertEquals("=", or.getANDExprList().get(0).getAtomicExprList().get(0).getOp().toString());
        LOG.info(or.toString());
        Assert.assertEquals("(@user=\""+expected+"\")", or.toString());
    }

    @Test
    public void testNumberQuery() {
        String query = "@field1 >= -1.234";
        EagleQueryParser parser = new EagleQueryParser(query);
        ORExpression or = null;
        try {
            or = parser.parse();
        } catch (EagleQueryParseException ex) {
            Assert.fail(ex.getMessage());
        }
        Assert.assertTrue(or.getANDExprList().size() == 1);
        Assert.assertEquals(1, or.getANDExprList().get(0).getAtomicExprList().size());
        Assert.assertEquals("@field1", or.getANDExprList().get(0).getAtomicExprList().get(0).getKey());
        Assert.assertEquals(-1.234, Double.parseDouble(or.getANDExprList().get(0).getAtomicExprList().get(0).getValue()), 0.0001);
        Assert.assertEquals(">=", or.getANDExprList().get(0).getAtomicExprList().get(0).getOp().toString());
        Assert.assertEquals(TokenType.NUMBER, or.getANDExprList().get(0).getAtomicExprList().get(0).getValueType());
    }

    @Test
    public void testContainQuery() {
        String query = "@name contains \"jame\"";
        EagleQueryParser parser = new EagleQueryParser(query);
        ORExpression or = null;
        try {
            or = parser.parse();
        } catch (EagleQueryParseException ex) {
            Assert.fail(ex.getMessage());
        }
        Assert.assertTrue(or.getANDExprList().size() == 1);
        Assert.assertEquals(1, or.getANDExprList().get(0).getAtomicExprList().size());
        Assert.assertEquals("@name", or.getANDExprList().get(0).getAtomicExprList().get(0).getKey());
        Assert.assertEquals("jame", or.getANDExprList().get(0).getAtomicExprList().get(0).getValue());
        Assert.assertEquals("CONTAINS", or.getANDExprList().get(0).getAtomicExprList().get(0).getOp().toString());
        Assert.assertEquals(TokenType.STRING, or.getANDExprList().get(0).getAtomicExprList().get(0).getValueType());
    }

    @Test
    public void testNotContainQuery() {
        String query = "@name not contains \"jame\"";
        EagleQueryParser parser = new EagleQueryParser(query);
        ORExpression or = null;
        try {
            or = parser.parse();
        } catch (EagleQueryParseException ex) {
            Assert.fail(ex.getMessage());
        }
        Assert.assertTrue(or.getANDExprList().size() == 1);
        Assert.assertEquals(1, or.getANDExprList().get(0).getAtomicExprList().size());
        Assert.assertEquals("@name", or.getANDExprList().get(0).getAtomicExprList().get(0).getKey());
        Assert.assertEquals("jame", or.getANDExprList().get(0).getAtomicExprList().get(0).getValue());
        Assert.assertEquals("NOT CONTAINS", or.getANDExprList().get(0).getAtomicExprList().get(0).getOp().toString());
        Assert.assertEquals(TokenType.STRING, or.getANDExprList().get(0).getAtomicExprList().get(0).getValueType());

        query = "@name NOT CONTAINS \"jame\"";
        parser = new EagleQueryParser(query);
        try {
            or = parser.parse();
        } catch (EagleQueryParseException ex) {
            Assert.fail(ex.getMessage());
        }
        Assert.assertTrue(or.getANDExprList().size() == 1);
        Assert.assertEquals(1, or.getANDExprList().get(0).getAtomicExprList().size());
        Assert.assertEquals("@name", or.getANDExprList().get(0).getAtomicExprList().get(0).getKey());
        Assert.assertEquals("jame", or.getANDExprList().get(0).getAtomicExprList().get(0).getValue());
        Assert.assertEquals("NOT CONTAINS", or.getANDExprList().get(0).getAtomicExprList().get(0).getOp().toString());
        Assert.assertEquals(TokenType.STRING, or.getANDExprList().get(0).getAtomicExprList().get(0).getValueType());

        query = "@name NOT                                          CONTAINS \"jame\"";
        parser = new EagleQueryParser(query);
        try {
            or = parser.parse();
        } catch (EagleQueryParseException ex) {
            Assert.fail(ex.getMessage());
        }
        Assert.assertTrue(or.getANDExprList().size() == 1);
        Assert.assertEquals(1, or.getANDExprList().get(0).getAtomicExprList().size());
        Assert.assertEquals("@name", or.getANDExprList().get(0).getAtomicExprList().get(0).getKey());
        Assert.assertEquals("jame", or.getANDExprList().get(0).getAtomicExprList().get(0).getValue());
        Assert.assertEquals("NOT CONTAINS", or.getANDExprList().get(0).getAtomicExprList().get(0).getOp().toString());
        Assert.assertEquals(TokenType.STRING, or.getANDExprList().get(0).getAtomicExprList().get(0).getValueType());
    }

    @Test
    public void testNullQuery() {
        String query = "@name is null";
        EagleQueryParser parser = new EagleQueryParser(query);
        ORExpression or = null;
        try {
            or = parser.parse();
        } catch (EagleQueryParseException ex) {
            Assert.fail(ex.getMessage());
        }
        Assert.assertTrue(or.getANDExprList().size() == 1);
        Assert.assertEquals(1, or.getANDExprList().get(0).getAtomicExprList().size());
        Assert.assertEquals("@name", or.getANDExprList().get(0).getAtomicExprList().get(0).getKey());
        Assert.assertEquals("null", or.getANDExprList().get(0).getAtomicExprList().get(0).getValue());
        Assert.assertEquals("IS", or.getANDExprList().get(0).getAtomicExprList().get(0).getOp().toString());
        Assert.assertEquals(TokenType.NULL, or.getANDExprList().get(0).getAtomicExprList().get(0).getValueType());

        query = "@name IS               NULL";
        parser = new EagleQueryParser(query);
        try {
            or = parser.parse();
        } catch (EagleQueryParseException ex) {
            Assert.fail(ex.getMessage());
        }
        Assert.assertTrue(or.getANDExprList().size() == 1);
        Assert.assertEquals(1, or.getANDExprList().get(0).getAtomicExprList().size());
        Assert.assertEquals("@name", or.getANDExprList().get(0).getAtomicExprList().get(0).getKey());
        Assert.assertEquals("NULL", or.getANDExprList().get(0).getAtomicExprList().get(0).getValue());
        Assert.assertEquals("IS", or.getANDExprList().get(0).getAtomicExprList().get(0).getOp().toString());
        Assert.assertEquals(TokenType.NULL, or.getANDExprList().get(0).getAtomicExprList().get(0).getValueType());

        query = "@name is not null";
        parser = new EagleQueryParser(query);
        try {
            or = parser.parse();
        } catch (EagleQueryParseException ex) {
            Assert.fail(ex.getMessage());
        }
        Assert.assertTrue(or.getANDExprList().size() == 1);
        Assert.assertEquals(1, or.getANDExprList().get(0).getAtomicExprList().size());
        Assert.assertEquals("@name", or.getANDExprList().get(0).getAtomicExprList().get(0).getKey());
        Assert.assertEquals("null", or.getANDExprList().get(0).getAtomicExprList().get(0).getValue());
        Assert.assertEquals("IS NOT", or.getANDExprList().get(0).getAtomicExprList().get(0).getOp().toString());
        Assert.assertEquals(TokenType.NULL, or.getANDExprList().get(0).getAtomicExprList().get(0).getValueType());

        query = "@name is               not               NULL";
        parser = new EagleQueryParser(query);
        try {
            or = parser.parse();
        } catch (EagleQueryParseException ex) {
            Assert.fail(ex.getMessage());
        }
        Assert.assertTrue(or.getANDExprList().size() == 1);
        Assert.assertEquals(1, or.getANDExprList().get(0).getAtomicExprList().size());
        Assert.assertEquals("@name", or.getANDExprList().get(0).getAtomicExprList().get(0).getKey());
        Assert.assertEquals("NULL", or.getANDExprList().get(0).getAtomicExprList().get(0).getValue());
        Assert.assertEquals("IS NOT", or.getANDExprList().get(0).getAtomicExprList().get(0).getOp().toString());
        Assert.assertEquals(TokenType.NULL, or.getANDExprList().get(0).getAtomicExprList().get(0).getValueType());

        query = "@name =               NULL";
        parser = new EagleQueryParser(query);
        try {
            or = parser.parse();
        } catch (EagleQueryParseException ex) {
            Assert.fail(ex.getMessage());
        }
        Assert.assertTrue(or.getANDExprList().size() == 1);
        Assert.assertEquals(1, or.getANDExprList().get(0).getAtomicExprList().size());
        Assert.assertEquals("@name", or.getANDExprList().get(0).getAtomicExprList().get(0).getKey());
        Assert.assertEquals("NULL", or.getANDExprList().get(0).getAtomicExprList().get(0).getValue());
        Assert.assertEquals("=", or.getANDExprList().get(0).getAtomicExprList().get(0).getOp().toString());
        Assert.assertEquals(TokenType.NULL, or.getANDExprList().get(0).getAtomicExprList().get(0).getValueType());

        query = "@name !=               NULL";
        parser = new EagleQueryParser(query);
        try {
            or = parser.parse();
        } catch (EagleQueryParseException ex) {
            Assert.fail(ex.getMessage());
        }
        Assert.assertTrue(or.getANDExprList().size() == 1);
        Assert.assertEquals(1, or.getANDExprList().get(0).getAtomicExprList().size());
        Assert.assertEquals("@name", or.getANDExprList().get(0).getAtomicExprList().get(0).getKey());
        Assert.assertEquals("NULL", or.getANDExprList().get(0).getAtomicExprList().get(0).getValue());
        Assert.assertEquals("!=", or.getANDExprList().get(0).getAtomicExprList().get(0).getOp().toString());
        Assert.assertEquals(TokenType.NULL, or.getANDExprList().get(0).getAtomicExprList().get(0).getValueType());
    }

    @Test
    public void testIsOrIsNotQuery() {
        String query = "@name is \"james\"";
        EagleQueryParser parser = new EagleQueryParser(query);
        ORExpression or = null;
        try {
            or = parser.parse();
        } catch (EagleQueryParseException ex) {
            Assert.fail(ex.getMessage());
        }
        Assert.assertTrue(or.getANDExprList().size() == 1);
        Assert.assertEquals(1, or.getANDExprList().get(0).getAtomicExprList().size());
        Assert.assertEquals("@name", or.getANDExprList().get(0).getAtomicExprList().get(0).getKey());
        Assert.assertEquals("james", or.getANDExprList().get(0).getAtomicExprList().get(0).getValue());
        Assert.assertEquals("IS", or.getANDExprList().get(0).getAtomicExprList().get(0).getOp().toString());
        Assert.assertEquals(TokenType.STRING, or.getANDExprList().get(0).getAtomicExprList().get(0).getValueType());

        query = "@name is   not \"james\"";
        parser = new EagleQueryParser(query);
        try {
            or = parser.parse();
        } catch (EagleQueryParseException ex) {
            Assert.fail(ex.getMessage());
        }
        Assert.assertTrue(or.getANDExprList().size() == 1);
        Assert.assertEquals(1, or.getANDExprList().get(0).getAtomicExprList().size());
        Assert.assertEquals("@name", or.getANDExprList().get(0).getAtomicExprList().get(0).getKey());
        Assert.assertEquals("james", or.getANDExprList().get(0).getAtomicExprList().get(0).getValue());
        Assert.assertEquals("IS NOT", or.getANDExprList().get(0).getAtomicExprList().get(0).getOp().toString());
        Assert.assertEquals(TokenType.STRING, or.getANDExprList().get(0).getAtomicExprList().get(0).getValueType());

        query = "@name is   1.234";
        parser = new EagleQueryParser(query);
        try {
            or = parser.parse();
        } catch (EagleQueryParseException ex) {
            Assert.fail(ex.getMessage());
        }
        Assert.assertTrue(or.getANDExprList().size() == 1);
        Assert.assertEquals(1, or.getANDExprList().get(0).getAtomicExprList().size());
        Assert.assertEquals("@name", or.getANDExprList().get(0).getAtomicExprList().get(0).getKey());
        Assert.assertEquals("1.234", or.getANDExprList().get(0).getAtomicExprList().get(0).getValue());
        Assert.assertEquals("IS", or.getANDExprList().get(0).getAtomicExprList().get(0).getOp().toString());
        Assert.assertEquals(TokenType.NUMBER, or.getANDExprList().get(0).getAtomicExprList().get(0).getValueType());

        query = "@name is   not 1.234";
        parser = new EagleQueryParser(query);
        try {
            or = parser.parse();
        } catch (EagleQueryParseException ex) {
            Assert.fail(ex.getMessage());
        }
        Assert.assertTrue(or.getANDExprList().size() == 1);
        Assert.assertEquals(1, or.getANDExprList().get(0).getAtomicExprList().size());
        Assert.assertEquals("@name", or.getANDExprList().get(0).getAtomicExprList().get(0).getKey());
        Assert.assertEquals("1.234", or.getANDExprList().get(0).getAtomicExprList().get(0).getValue());
        Assert.assertEquals("IS NOT", or.getANDExprList().get(0).getAtomicExprList().get(0).getOp().toString());
        Assert.assertEquals(TokenType.NUMBER, or.getANDExprList().get(0).getAtomicExprList().get(0).getValueType());
    }

    @Test
    public void testINListQuery() {
        String query = "@name in (\"jame\",\"lebron\")";
        EagleQueryParser parser = new EagleQueryParser(query);
        ORExpression or = null;
        try {
            or = parser.parse();
        } catch (EagleQueryParseException ex) {
            Assert.fail(ex.getMessage());
        }
        Assert.assertTrue(or.getANDExprList().size() == 1);
        Assert.assertEquals(1, or.getANDExprList().get(0).getAtomicExprList().size());
        Assert.assertEquals("@name", or.getANDExprList().get(0).getAtomicExprList().get(0).getKey());
        Assert.assertEquals("(\"jame\",\"lebron\")", or.getANDExprList().get(0).getAtomicExprList().get(0).getValue());
        Assert.assertEquals("IN", or.getANDExprList().get(0).getAtomicExprList().get(0).getOp().toString());
        Assert.assertEquals(TokenType.LIST, or.getANDExprList().get(0).getAtomicExprList().get(0).getValueType());

        query = "@name NOT IN (1,\"lebron\")";
        parser = new EagleQueryParser(query);
        try {
            or = parser.parse();
        } catch (EagleQueryParseException ex) {
            Assert.fail(ex.getMessage());
        }
        Assert.assertTrue(or.getANDExprList().size() == 1);
        Assert.assertEquals(1, or.getANDExprList().get(0).getAtomicExprList().size());
        Assert.assertEquals("@name", or.getANDExprList().get(0).getAtomicExprList().get(0).getKey());
        Assert.assertEquals("(1,\"lebron\")", or.getANDExprList().get(0).getAtomicExprList().get(0).getValue());
        Assert.assertEquals("NOT IN", or.getANDExprList().get(0).getAtomicExprList().get(0).getOp().toString());
        Assert.assertEquals(TokenType.LIST, or.getANDExprList().get(0).getAtomicExprList().get(0).getValueType());

        query = "@name not                      in (1,\"lebron\")";
        parser = new EagleQueryParser(query);
        try {
            or = parser.parse();
        } catch (EagleQueryParseException ex) {
            Assert.fail(ex.getMessage());
        }
        Assert.assertTrue(or.getANDExprList().size() == 1);
        Assert.assertEquals(1, or.getANDExprList().get(0).getAtomicExprList().size());
        Assert.assertEquals("@name", or.getANDExprList().get(0).getAtomicExprList().get(0).getKey());
        Assert.assertEquals("(1,\"lebron\")", or.getANDExprList().get(0).getAtomicExprList().get(0).getValue());
        Assert.assertEquals("NOT IN", or.getANDExprList().get(0).getAtomicExprList().get(0).getOp().toString());
        Assert.assertEquals(TokenType.LIST, or.getANDExprList().get(0).getAtomicExprList().get(0).getValueType());
    }

    @Test
    public void testEmptyString() {
        String query = "@name = \"\"";
        EagleQueryParser parser = new EagleQueryParser(query);
        ORExpression or = null;
        try {
            or = parser.parse();
        } catch (EagleQueryParseException ex) {
            Assert.fail(ex.getMessage());
        }
        Assert.assertNotNull(or);
        Assert.assertEquals("@name", or.getANDExprList().get(0).getAtomicExprList().get(0).getKey());
        Assert.assertEquals("", or.getANDExprList().get(0).getAtomicExprList().get(0).getValue());
        Assert.assertEquals("=", or.getANDExprList().get(0).getAtomicExprList().get(0).getOp().toString());
        Assert.assertEquals(TokenType.STRING, or.getANDExprList().get(0).getAtomicExprList().get(0).getValueType());
    }

    /**
     * Will split tokens for escaped string
     *
     * "va\"lue" => "va\"lue"
     * ("va\"lue","va,lue") => ["va\\\"lue","va,lue"]
     *
     */
    @Test
    public void testEscapedQuotesString() {
        String query = "@value = \"value\\\"content, and another content\"";
        EagleQueryParser parser = new EagleQueryParser(query);
        ORExpression or = null;
        try {
            or = parser.parse();
        } catch (EagleQueryParseException ex) {
            Assert.fail(ex.getMessage());
        }
        Assert.assertNotNull(or);
        Assert.assertEquals("@value", or.getANDExprList().get(0).getAtomicExprList().get(0).getKey());
        Assert.assertEquals("value\"content, and another content", or.getANDExprList().get(0).getAtomicExprList().get(0).getValue());
        Assert.assertEquals("=", or.getANDExprList().get(0).getAtomicExprList().get(0).getOp().toString());
        Assert.assertEquals(TokenType.STRING, or.getANDExprList().get(0).getAtomicExprList().get(0).getValueType());

        query = "@value in (\"value\\\"content, and another content\",\"others item\")";
        parser = new EagleQueryParser(query);
        or = null;
        try {
            or = parser.parse();
        } catch (EagleQueryParseException ex) {
            Assert.fail(ex.getMessage());
        }
        Assert.assertNotNull(or);
        Assert.assertEquals("@value", or.getANDExprList().get(0).getAtomicExprList().get(0).getKey());
        Assert.assertEquals("(\"value\\\"content, and another content\",\"others item\")", or.getANDExprList().get(0).getAtomicExprList().get(0).getValue());
        Assert.assertEquals("IN", or.getANDExprList().get(0).getAtomicExprList().get(0).getOp().toString());
        Assert.assertEquals(TokenType.LIST, or.getANDExprList().get(0).getAtomicExprList().get(0).getValueType());

        query = "@value in (\"value\\\"content, and another content\",\"others item\",-1.2345)";
        parser = new EagleQueryParser(query);
        or = null;
        try {
            or = parser.parse();
        } catch (EagleQueryParseException ex) {
            Assert.fail(ex.getMessage());
        }
        Assert.assertNotNull(or);
        Assert.assertEquals("@value", or.getANDExprList().get(0).getAtomicExprList().get(0).getKey());
        Assert.assertEquals("(\"value\\\"content, and another content\",\"others item\",-1.2345)", or.getANDExprList().get(0).getAtomicExprList().get(0).getValue());
        Assert.assertEquals("IN", or.getANDExprList().get(0).getAtomicExprList().get(0).getOp().toString());
        Assert.assertEquals(TokenType.LIST, or.getANDExprList().get(0).getAtomicExprList().get(0).getValueType());
    }

    @Test
    public void testCompareAtomicExpression() {
        String query = "EXP{@mapProgress} < EXP{@reduceProgress}";
        EagleQueryParser parser = new EagleQueryParser(query);
        ORExpression or = null;
        try {
            or = parser.parse();
        } catch (EagleQueryParseException ex) {
            Assert.fail(ex.getMessage());
        }
        Assert.assertTrue(or.getANDExprList().size() == 1);
        Assert.assertEquals(1, or.getANDExprList().get(0).getAtomicExprList().size());
        Assert.assertEquals("mapProgress", or.getANDExprList().get(0).getAtomicExprList().get(0).getKey());
        Assert.assertEquals("reduceProgress", or.getANDExprList().get(0).getAtomicExprList().get(0).getValue());
        Assert.assertEquals("<", or.getANDExprList().get(0).getAtomicExprList().get(0).getOp().toString());
        Assert.assertEquals("(mapProgress<reduceProgress)", or.toString());
    }

    @Test
    public void testCompareArithmeticExpressionWithNumeric() {
        String query = "EXP{(@mapProgress + @reduceProgress) / (@endTime - @startTime)} < 0.005";
        EagleQueryParser parser = new EagleQueryParser(query);
        ORExpression or = null;
        try {
            or = parser.parse();
        } catch (EagleQueryParseException ex) {
            Assert.fail(ex.getMessage());
        }
        Assert.assertTrue(or.getANDExprList().size() == 1);
        Assert.assertEquals(1, or.getANDExprList().get(0).getAtomicExprList().size());
        Assert.assertEquals("(mapProgress + reduceProgress) / (endTime - startTime)", or.getANDExprList().get(0).getAtomicExprList().get(0).getKey());
        Assert.assertEquals("0.005", or.getANDExprList().get(0).getAtomicExprList().get(0).getValue());
        Assert.assertEquals("<", or.getANDExprList().get(0).getAtomicExprList().get(0).getOp().toString());
        LOG.info(or.toString());
        Assert.assertEquals("((mapProgress + reduceProgress) / (endTime - startTime)<0.005)", or.toString());
    }

    @Test
    public void testComplexExpressionWithNestedBrace() {
        String query = "EXP{((@a + @b) / @c) + @d}< 0.005";
        EagleQueryParser parser = new EagleQueryParser(query);
        ORExpression or = null;
        try {
            or = parser.parse();
        } catch (EagleQueryParseException ex) {
            Assert.fail(ex.getMessage());
        }
        Assert.assertTrue(or.getANDExprList().size() == 1);
        Assert.assertEquals(1, or.getANDExprList().get(0).getAtomicExprList().size());
        Assert.assertEquals("((a + b) / c) + d", or.getANDExprList().get(0).getAtomicExprList().get(0).getKey());
        Assert.assertEquals("0.005", or.getANDExprList().get(0).getAtomicExprList().get(0).getValue());
        Assert.assertEquals("<", or.getANDExprList().get(0).getAtomicExprList().get(0).getOp().toString());
        Assert.assertEquals("(((a + b) / c) + d<0.005)", or.toString());
    }

    @Test
    public void testComplexExpressionWithAndCondition() {
        String query = "(EXP{@a + @b} > 3) AND (@b >10)";
        EagleQueryParser parser = new EagleQueryParser(query);
        ORExpression or = null;
        try {
            or = parser.parse();
        } catch (EagleQueryParseException ex) {
            Assert.fail(ex.getMessage());
        }
        Assert.assertTrue(or.getANDExprList().size() == 1);
        ANDExpression and = or.getANDExprList().get(0);
        Assert.assertEquals(2, and.getAtomicExprList().size());
        Assert.assertEquals("a + b>3", and.getAtomicExprList().get(0).toString());
        Assert.assertEquals("@b>10", and.getAtomicExprList().get(1).toString());

        AtomicExpression leftExpression = and.getAtomicExprList().get(0);
        Assert.assertEquals("a + b", leftExpression.getKey());
        Assert.assertEquals(TokenType.EXP, leftExpression.getKeyType());
        Assert.assertEquals(">", leftExpression.getOp().toString());
        Assert.assertEquals("3", leftExpression.getValue());
        Assert.assertEquals(TokenType.NUMBER, leftExpression.getValueType());
        AtomicExpression rightExpression = and.getAtomicExprList().get(1);
        Assert.assertEquals("@b", rightExpression.getKey());
        Assert.assertEquals(TokenType.ID, rightExpression.getKeyType());
        Assert.assertEquals(">", rightExpression.getOp().toString());
        Assert.assertEquals("10",rightExpression.getValue());
        Assert.assertEquals(TokenType.NUMBER, rightExpression.getValueType());
    }

    @Test
    public void testComplexExpressionWithConditionAndNestedBrace() {
        String query = "(EXP{(@a + @b) / ((@c + @d)*(@e)/(@d))} > EXP{@c + @d}) AND (EXP{@e + @f} > EXP{@h + @i})";
        EagleQueryParser parser = new EagleQueryParser(query);
        ORExpression or = null;
        try {
            or = parser.parse();
        } catch (EagleQueryParseException ex) {
            Assert.fail(ex.getMessage());
        }
        Assert.assertTrue(or.getANDExprList().size() == 1);
        ANDExpression and = or.getANDExprList().get(0);
        Assert.assertEquals(2, and.getAtomicExprList().size());
        Assert.assertEquals("(a + b) / ((c + d)*(e)/(d))>c + d", and.getAtomicExprList().get(0).toString());
        Assert.assertEquals("e + f>h + i", and.getAtomicExprList().get(1).toString());

        AtomicExpression leftExpression = and.getAtomicExprList().get(0);
        Assert.assertEquals("(a + b) / ((c + d)*(e)/(d))", leftExpression.getKey());
        Assert.assertEquals(">", leftExpression.getOp().toString());
        Assert.assertEquals("c + d", leftExpression.getValue());

        AtomicExpression rightExpression = and.getAtomicExprList().get(1);
        Assert.assertEquals("e + f", rightExpression.getKey());
        Assert.assertEquals(">", rightExpression.getOp().toString());
        Assert.assertEquals("h + i",rightExpression.getValue());
    }

    @Test
    public void testNegativeExpressionCase() {
        String query = "(EXP{(@a + @b) / ((@c + @d)*(@e)/(@d))}} > EXP{@c + @d}) AND (EXP{@e + @f} > EXP{@h + @i})";
        EagleQueryParser parser = new EagleQueryParser(query);
        boolean parseFail = true;
        try {
            parser.parse();
        } catch (EagleQueryParseException ex) {
            parseFail = false;
        }
        Assert.assertFalse(parseFail);

        query = "(EXP{{(@a + @b) / ((@c + @d)*(@e)/(@d))}} > EXP{@c + @d}) AND (EXP{@e + @f} > EXP{@h + @i})";
        parser = new EagleQueryParser(query);
        parseFail = true;
        try {
            parser.parse();
        } catch (EagleQueryParseException ex) {
            parseFail = false;
        }
        Assert.assertFalse(parseFail);

        query = "(EXP{(@a + @b) / ((@c + @d)*(@e)/(@d))} > EXP{@c + @d}) AND EXP{})";
        parser = new EagleQueryParser(query);
        parseFail = true;
        try {
            parser.parse();
        } catch (EagleQueryParseException ex) {
            parseFail = false;
        }
        Assert.assertFalse(parseFail);

    }

    @Test
    public void testIsExpression() {
        Assert.assertTrue(TokenConstant.isExpression("EXP{ count }"));
        Assert.assertFalse(TokenConstant.isExpression("count"));
    }
}
