/**
 * 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.hadoop.yarn.server.timelineservice.reader;

import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;

import org.apache.hadoop.yarn.server.timelineservice.reader.filter.TimelineCompareFilter;
import org.apache.hadoop.yarn.server.timelineservice.reader.filter.TimelineCompareOp;
import org.apache.hadoop.yarn.server.timelineservice.reader.filter.TimelineExistsFilter;
import org.apache.hadoop.yarn.server.timelineservice.reader.filter.TimelineFilterList;
import org.apache.hadoop.yarn.server.timelineservice.reader.filter.TimelineFilterList.Operator;
import org.apache.hadoop.yarn.server.timelineservice.reader.filter.TimelineKeyValueFilter;
import org.apache.hadoop.yarn.server.timelineservice.reader.filter.TimelineKeyValuesFilter;
import org.apache.hadoop.yarn.server.timelineservice.reader.filter.TimelinePrefixFilter;
import org.junit.Test;

import com.google.common.collect.Sets;

public class TestTimelineReaderWebServicesUtils {
  private static void verifyFilterList(String expr, TimelineFilterList list,
      TimelineFilterList expectedList) throws Exception {
    assertNotNull(list);
    assertTrue("Unexpected List received after parsing expression " + expr +
        ". Expected=" + expectedList + " but Actual=" + list,
        list.equals(expectedList));
  }

  @Test
  public void testMetricFiltersParsing() throws Exception {
    String expr = "(((key11 ne 234 AND key12 gt 23) AND " +
        "(key13 lt 34 OR key14 ge 567)) OR (key21 lt 24 OR key22 le 45))";
    TimelineFilterList expectedList = new TimelineFilterList(
        Operator.OR,
        new TimelineFilterList(
            Operator.AND,
            new TimelineFilterList(
                Operator.AND,
                new TimelineCompareFilter(TimelineCompareOp.NOT_EQUAL,
                    "key11", 234, false),
                new TimelineCompareFilter(TimelineCompareOp.GREATER_THAN,
                    "key12", 23, true)
            ),
            new TimelineFilterList(
                Operator.OR,
                new TimelineCompareFilter(TimelineCompareOp.LESS_THAN,
                    "key13", 34, true),
                new TimelineCompareFilter(TimelineCompareOp.GREATER_OR_EQUAL,
                    "key14", 567, true)
            )
        ),
        new TimelineFilterList(
            Operator.OR,
            new TimelineCompareFilter(TimelineCompareOp.LESS_THAN,
                "key21", 24, true),
            new TimelineCompareFilter(TimelineCompareOp.LESS_OR_EQUAL,
                "key22", 45, true)
        )
    );
    verifyFilterList(expr,
        TimelineReaderWebServicesUtils.parseMetricFilters(expr), expectedList);

    expr = "abc ene 234";
    expectedList = new TimelineFilterList(
        new TimelineCompareFilter(TimelineCompareOp.NOT_EQUAL,
            "abc", 234, true)
    );
    verifyFilterList(expr,
        TimelineReaderWebServicesUtils.parseMetricFilters(expr), expectedList);

    expr = "abc ne 234";
    expectedList = new TimelineFilterList(
        new TimelineCompareFilter(TimelineCompareOp.NOT_EQUAL,
            "abc", 234, false)
    );
    verifyFilterList(expr,
        TimelineReaderWebServicesUtils.parseMetricFilters(expr), expectedList);

    expr = "abc ne 234 AND def gt 23";
    expectedList = new TimelineFilterList(
        new TimelineCompareFilter(TimelineCompareOp.NOT_EQUAL,
            "abc", 234, false),
        new TimelineCompareFilter(TimelineCompareOp.GREATER_THAN,
            "def", 23, true)
    );
    verifyFilterList(expr,
        TimelineReaderWebServicesUtils.parseMetricFilters(expr), expectedList);

    expr = "(abc ne 234 AND def gt 23)";
    expectedList = new TimelineFilterList(
        new TimelineCompareFilter(TimelineCompareOp.NOT_EQUAL,
            "abc", 234, false),
        new TimelineCompareFilter(TimelineCompareOp.GREATER_THAN,
            "def", 23, true)
    );
    verifyFilterList(expr,
        TimelineReaderWebServicesUtils.parseMetricFilters(expr), expectedList);

    expr = "abc ne 234 AND def gt 23 OR rst lt 24";
    expectedList = new TimelineFilterList(
        Operator.OR,
        new TimelineFilterList(
            new TimelineCompareFilter(TimelineCompareOp.NOT_EQUAL,
                "abc", 234, false),
            new TimelineCompareFilter(TimelineCompareOp.GREATER_THAN,
                "def", 23, true)
        ),
        new TimelineCompareFilter(TimelineCompareOp.LESS_THAN,
            "rst", 24, true)
    );
    verifyFilterList(expr,
        TimelineReaderWebServicesUtils.parseMetricFilters(expr), expectedList);

    expr = "abc ne 234 AND def gt 23 OR rst lt 24 OR xyz le 456";
    expectedList = new TimelineFilterList(
        Operator.OR,
        new TimelineFilterList(
            new TimelineCompareFilter(TimelineCompareOp.NOT_EQUAL,
                "abc", 234, false),
            new TimelineCompareFilter(TimelineCompareOp.GREATER_THAN,
                "def", 23, true)
        ),
        new TimelineCompareFilter(TimelineCompareOp.LESS_THAN,
            "rst", 24, true),
        new TimelineCompareFilter(TimelineCompareOp.LESS_OR_EQUAL,
            "xyz", 456, true)
    );
    verifyFilterList(expr,
        TimelineReaderWebServicesUtils.parseMetricFilters(expr), expectedList);

    expr = "abc ne 234 AND def gt 23 OR rst lt 24 OR xyz le 456 AND pqr ge 2";
    expectedList = new TimelineFilterList(
        new TimelineFilterList(
            Operator.OR,
            new TimelineFilterList(
                new TimelineCompareFilter(TimelineCompareOp.NOT_EQUAL,
                    "abc", 234, false),
                new TimelineCompareFilter(TimelineCompareOp.GREATER_THAN,
                    "def", 23, true)
            ),
            new TimelineCompareFilter(TimelineCompareOp.LESS_THAN,
                "rst", 24, true),
            new TimelineCompareFilter(TimelineCompareOp.LESS_OR_EQUAL,
                "xyz", 456, true)
        ),
        new TimelineCompareFilter(TimelineCompareOp.GREATER_OR_EQUAL,
            "pqr", 2, true)
    );
    verifyFilterList(expr,
        TimelineReaderWebServicesUtils.parseMetricFilters(expr), expectedList);

    // Test with unnecessary spaces.
    expr = "  abc ne   234       AND       def           gt 23 OR     rst lt "+
        "           24     OR xyz     le     456    AND pqr ge 2        ";
    expectedList = new TimelineFilterList(
        new TimelineFilterList(
            Operator.OR,
            new TimelineFilterList(
                new TimelineCompareFilter(TimelineCompareOp.NOT_EQUAL,
                    "abc", 234, false),
                new TimelineCompareFilter(TimelineCompareOp.GREATER_THAN,
                    "def", 23, true)
            ),
            new TimelineCompareFilter(TimelineCompareOp.LESS_THAN,
                "rst", 24, true),
            new TimelineCompareFilter(TimelineCompareOp.LESS_OR_EQUAL,
                "xyz", 456, true)
        ),
        new TimelineCompareFilter(TimelineCompareOp.GREATER_OR_EQUAL,
            "pqr", 2, true)
    );
    verifyFilterList(expr,
        TimelineReaderWebServicesUtils.parseMetricFilters(expr), expectedList);

    expr = "(((key11 ne 234 AND key12 gt 23 OR key13 lt 24 OR key14 le 456 " +
        "AND key15 ge 2) AND (key16 lt 34 OR key17 ge 567)) OR (key21 lt 24 " +
        "OR key22 le 45))";
    expectedList = new TimelineFilterList(
        Operator.OR,
        new TimelineFilterList(
            Operator.AND,
            new TimelineFilterList(
                new TimelineFilterList(
                    Operator.OR,
                    new TimelineFilterList(
                        new TimelineCompareFilter(TimelineCompareOp.NOT_EQUAL,
                            "key11", 234, false),
                        new TimelineCompareFilter(
                            TimelineCompareOp.GREATER_THAN, "key12", 23, true)
                    ),
                    new TimelineCompareFilter(TimelineCompareOp.LESS_THAN,
                        "key13", 24, true),
                    new TimelineCompareFilter(TimelineCompareOp.LESS_OR_EQUAL,
                        "key14", 456, true)
                ),
                new TimelineCompareFilter(TimelineCompareOp.GREATER_OR_EQUAL,
                    "key15", 2, true)
            ),
            new TimelineFilterList(
                Operator.OR,
                new TimelineCompareFilter(TimelineCompareOp.LESS_THAN,
                    "key16", 34, true),
                new TimelineCompareFilter(TimelineCompareOp.GREATER_OR_EQUAL,
                    "key17", 567, true)
            )
        ),
        new TimelineFilterList(
            Operator.OR,
            new TimelineCompareFilter(TimelineCompareOp.LESS_THAN,
                "key21", 24, true),
            new TimelineCompareFilter(TimelineCompareOp.LESS_OR_EQUAL,
                "key22", 45, true)
        )
    );
    verifyFilterList(expr,
        TimelineReaderWebServicesUtils.parseMetricFilters(expr), expectedList);

    expr = "   (  (     (        key11      ne     234    AND key12    gt   " +
        "23    OR    key13    lt    24 OR key14 le 456   AND   key15   ge   2" +
        "   )   AND ( key16 lt 34 OR key17 ge 567 )    )     OR " +
        "(   key21 lt 24 OR key22 le 45 )   )    ";
    expectedList = new TimelineFilterList(
        Operator.OR,
        new TimelineFilterList(
            Operator.AND,
            new TimelineFilterList(
                new TimelineFilterList(
                    Operator.OR,
                    new TimelineFilterList(
                        new TimelineCompareFilter(TimelineCompareOp.NOT_EQUAL,
                            "key11", 234, false),
                        new TimelineCompareFilter(
                            TimelineCompareOp.GREATER_THAN, "key12", 23, true)
                    ),
                    new TimelineCompareFilter(TimelineCompareOp.LESS_THAN,
                        "key13", 24, true),
                    new TimelineCompareFilter(TimelineCompareOp.LESS_OR_EQUAL,
                        "key14", 456, true)
                ),
                new TimelineCompareFilter(TimelineCompareOp.GREATER_OR_EQUAL,
                    "key15", 2, true)
            ),
            new TimelineFilterList(
                Operator.OR,
                new TimelineCompareFilter(TimelineCompareOp.LESS_THAN,
                    "key16", 34, true),
                new TimelineCompareFilter(TimelineCompareOp.GREATER_OR_EQUAL,
                    "key17", 567, true)
            )
        ),
        new TimelineFilterList(
            Operator.OR,
            new TimelineCompareFilter(TimelineCompareOp.LESS_THAN,
                "key21", 24, true),
            new TimelineCompareFilter(TimelineCompareOp.LESS_OR_EQUAL,
                "key22", 45, true)
        )
    );
    verifyFilterList(expr,
        TimelineReaderWebServicesUtils.parseMetricFilters(expr), expectedList);

    expr = "(((key11 ne 234 AND key12 gt 23 OR key13 lt 24 OR key14 le 456 " +
        "AND key15 ge 2) AND (key16 lt 34 OR key17 ge 567)) OR (key21 lt 24 " +
        "OR key22 le 45)";
    try {
      TimelineReaderWebServicesUtils.parseMetricFilters(expr);
      fail("Improper brackers. Exception should have been thrown.");
    } catch (TimelineParseException e) {}

    expr = "(((key11 ne 234 AND key12 gt v3 OR key13 lt 24 OR key14 le 456 " +
        "AND key15 ge 2) AND (key16 lt 34 OR key17 ge 567)) OR (key21 lt 24 " +
        "OR key22 le 45))";
    try {
      TimelineReaderWebServicesUtils.parseMetricFilters(expr);
      fail("Non Numeric value. Exception should have been thrown.");
    } catch (TimelineParseException e) {}

    expr = "(((key11 ne (234 AND key12 gt 3 OR key13 lt 24 OR key14 le 456 " +
        "AND key15 ge 2) AND (key16 lt 34 OR key17 ge 567)) OR (key21 lt 24 " +
        "OR key22 le 45))";
    try {
      TimelineReaderWebServicesUtils.parseMetricFilters(expr);
      fail("Unexpected opening bracket. Exception should have been thrown.");
    } catch (TimelineParseException e) {}

    expr = "(((k)ey11 ne 234 AND key12 gt 3 OR key13 lt 24 OR key14 le 456 " +
        "AND key15 ge 2) AND (key16 lt 34 OR key17 ge 567)) OR (key21 lt 24 " +
        "OR key22 le 45))";
    try {
      TimelineReaderWebServicesUtils.parseMetricFilters(expr);
      fail("Unexpected closing bracket. Exception should have been thrown.");
    } catch (TimelineParseException e) {}

    expr = "(((key11 rs 234 AND key12 gt 3 OR key13 lt 24 OR key14 le 456 " +
        "AND key15 ge 2) AND (key16 lt 34 OR key17 ge 567)) OR (key21 lt 24 " +
        "OR key22 le 45))";
    try {
      TimelineReaderWebServicesUtils.parseMetricFilters(expr);
      fail("Improper compare op. Exception should have been thrown.");
    } catch (TimelineParseException e) {}

    expr = "(((key11 ne 234 PI key12 gt 3 OR key13 lt 24 OR key14 le 456 " +
        "AND key15 ge 2) AND (key16 lt 34 OR key17 ge 567)) OR (key21 lt 24 " +
        "OR key22 le 45))";
    try {
      TimelineReaderWebServicesUtils.parseMetricFilters(expr);
      fail("Improper op. Exception should have been thrown.");
    } catch (TimelineParseException e) {}

    expr = "(((key11 ne 234 PI key12 gt 3 OR key13 lt 24 OR key14 le 456 " +
        "AND key15 ge 2) AND (key16 lt 34 OR key17 ge 567)) OR (key21 lt 24 " +
        "OR key22 le 45))";
    try {
      TimelineReaderWebServicesUtils.parseMetricFilters(expr);
      fail("Improper op. Exception should have been thrown.");
    } catch (TimelineParseException e) {}

    expr = "(key11 ne 234 AND key12 gt 3)) OR (key13 lt 24 OR key14 le 456)";
    try {
      TimelineReaderWebServicesUtils.parseMetricFilters(expr);
      fail("Unbalanced brackets. Exception should have been thrown.");
    } catch (TimelineParseException e) {}

    expr = "(key11 rne 234 AND key12 gt 3) OR (key13 lt 24 OR key14 le 456)";
    try {
      TimelineReaderWebServicesUtils.parseMetricFilters(expr);
      fail("Invalid compareop. Exception should have been thrown.");
    } catch (TimelineParseException e) {}

    expr = "(key11 ne 234 AND key12 gt 3) OR (key13 lt 24 OR key14 le";
    try {
      TimelineReaderWebServicesUtils.parseMetricFilters(expr);
      fail("Compareop cant be parsed. Exception should have been thrown.");
    } catch (TimelineParseException e) {}

    assertNull(TimelineReaderWebServicesUtils.parseMetricFilters(null));
    assertNull(TimelineReaderWebServicesUtils.parseMetricFilters("   "));
  }

  @Test
  public void testConfigFiltersParsing() throws Exception {
    String expr = "(((key11 ne 234 AND key12 eq val12) AND " +
        "(key13 ene val13 OR key14 eq 567)) OR (key21 eq val_21 OR key22 eq " +
        "val.22))";
    TimelineFilterList expectedList = new TimelineFilterList(
        Operator.OR,
        new TimelineFilterList(
            Operator.AND,
            new TimelineFilterList(
                Operator.AND,
                new TimelineKeyValueFilter(TimelineCompareOp.NOT_EQUAL,
                    "key11", "234", false),
                new TimelineKeyValueFilter(TimelineCompareOp.EQUAL,
                    "key12", "val12", true)
            ),
            new TimelineFilterList(
                Operator.OR,
                new TimelineKeyValueFilter(TimelineCompareOp.NOT_EQUAL,
                    "key13", "val13", true),
                new TimelineKeyValueFilter(TimelineCompareOp.EQUAL,
                    "key14", "567", true)
            )
        ),
        new TimelineFilterList(
            Operator.OR,
            new TimelineKeyValueFilter(TimelineCompareOp.EQUAL,
                "key21", "val_21", true),
            new TimelineKeyValueFilter(TimelineCompareOp.EQUAL,
                "key22", "val.22", true)
        )
    );
    verifyFilterList(expr, TimelineReaderWebServicesUtils.
        parseKVFilters(expr, true), expectedList);

    expr = "abc ne 234 AND def eq 23 OR rst ene 24 OR xyz eq 456 AND pqr eq 2";
    expectedList = new TimelineFilterList(
        new TimelineFilterList(
            Operator.OR,
            new TimelineFilterList(
                new TimelineKeyValueFilter(TimelineCompareOp.NOT_EQUAL,
                    "abc", "234", false),
                new TimelineKeyValueFilter(TimelineCompareOp.EQUAL,
                    "def", "23", true)
            ),
            new TimelineKeyValueFilter(TimelineCompareOp.NOT_EQUAL,
                "rst", "24", true),
            new TimelineKeyValueFilter(TimelineCompareOp.EQUAL,
                "xyz", "456", true)
        ),
        new TimelineKeyValueFilter(TimelineCompareOp.EQUAL,
            "pqr", "2", true)
    );
    verifyFilterList(expr, TimelineReaderWebServicesUtils.
        parseKVFilters(expr, true), expectedList);

    // Test with unnecessary spaces.
    expr = "  abc ne   234       AND       def           eq 23 OR     rst ene "+
        "           24     OR xyz     eq     456    AND pqr eq 2        ";
    expectedList = new TimelineFilterList(
        new TimelineFilterList(
            Operator.OR,
            new TimelineFilterList(
                new TimelineKeyValueFilter(TimelineCompareOp.NOT_EQUAL,
                    "abc", "234", false),
                new TimelineKeyValueFilter(TimelineCompareOp.EQUAL,
                    "def", "23", true)
            ),
            new TimelineKeyValueFilter(TimelineCompareOp.NOT_EQUAL,
                "rst", "24", true),
            new TimelineKeyValueFilter(TimelineCompareOp.EQUAL,
                "xyz", "456", true)
        ),
        new TimelineKeyValueFilter(TimelineCompareOp.EQUAL,
            "pqr", "2", true)
    );
    verifyFilterList(expr, TimelineReaderWebServicesUtils.
        parseKVFilters(expr, true), expectedList);

    expr = "abc gt 234 AND def eq 23 OR rst ene 24 OR xyz eq 456 AND pqr eq 2";
    try {
      TimelineReaderWebServicesUtils.parseKVFilters(expr, true);
      fail("Invalid compareop specified for config filters. Should be either" +
          " eq,ne or ene and exception should have been thrown.");
    } catch (TimelineParseException e){}
  }
  @Test
  public void testInfoFiltersParsing() throws Exception {
    String expr = "(((key11 ne 234 AND key12 eq val12) AND " +
        "(key13 ene val13 OR key14 eq 567)) OR (key21 eq val_21 OR key22 eq " +
        "5.0))";
    TimelineFilterList expectedList = new TimelineFilterList(
        Operator.OR,
        new TimelineFilterList(
            Operator.AND,
            new TimelineFilterList(
                Operator.AND,
                new TimelineKeyValueFilter(TimelineCompareOp.NOT_EQUAL,
                    "key11", 234, false),
                new TimelineKeyValueFilter(TimelineCompareOp.EQUAL,
                    "key12", "val12", true)
            ),
            new TimelineFilterList(
                Operator.OR,
                new TimelineKeyValueFilter(TimelineCompareOp.NOT_EQUAL,
                    "key13", "val13", true),
                new TimelineKeyValueFilter(TimelineCompareOp.EQUAL,
                    "key14", 567, true)
            )
        ),
        new TimelineFilterList(
            Operator.OR,
            new TimelineKeyValueFilter(TimelineCompareOp.EQUAL,
                "key21", "val_21", true),
            new TimelineKeyValueFilter(TimelineCompareOp.EQUAL,
                "key22", 5.0, true)
        )
    );
    verifyFilterList(expr, TimelineReaderWebServicesUtils.
        parseKVFilters(expr, false), expectedList);

    expr = "abc ne 234 AND def eq 23 OR rst ene 24 OR xyz eq 456 AND pqr eq " +
        "val.1234";
    expectedList = new TimelineFilterList(
        new TimelineFilterList(
            Operator.OR,
            new TimelineFilterList(
                new TimelineKeyValueFilter(TimelineCompareOp.NOT_EQUAL,
                    "abc", 234, false),
                new TimelineKeyValueFilter(TimelineCompareOp.EQUAL,
                    "def", 23, true)
            ),
            new TimelineKeyValueFilter(TimelineCompareOp.NOT_EQUAL,
                "rst", 24, true),
            new TimelineKeyValueFilter(TimelineCompareOp.EQUAL,
                "xyz", 456, true)
        ),
        new TimelineKeyValueFilter(TimelineCompareOp.EQUAL,
            "pqr", "val.1234", true)
    );
    verifyFilterList(expr, TimelineReaderWebServicesUtils.
        parseKVFilters(expr, false), expectedList);

    // Test with unnecessary spaces.
    expr = "  abc ne   234       AND       def           eq 23 OR     rst ene "+
        "           24     OR xyz     eq     456    AND pqr eq 2        ";
    expectedList = new TimelineFilterList(
        new TimelineFilterList(
            Operator.OR,
            new TimelineFilterList(
                new TimelineKeyValueFilter(TimelineCompareOp.NOT_EQUAL,
                    "abc", 234, false),
                new TimelineKeyValueFilter(TimelineCompareOp.EQUAL,
                    "def", 23, true)
            ),
            new TimelineKeyValueFilter(TimelineCompareOp.NOT_EQUAL,
                "rst", 24, true),
            new TimelineKeyValueFilter(TimelineCompareOp.EQUAL,
                "xyz", 456, true)
        ),
        new TimelineKeyValueFilter(TimelineCompareOp.EQUAL,
            "pqr", 2, true)
    );
    verifyFilterList(expr, TimelineReaderWebServicesUtils.
        parseKVFilters(expr, false), expectedList);
  }

  @Test
  public void testEventFiltersParsing() throws Exception {
    String expr = "abc,def";
    TimelineFilterList expectedList = new TimelineFilterList(
        new TimelineExistsFilter(TimelineCompareOp.EQUAL, "abc"),
        new TimelineExistsFilter(TimelineCompareOp.EQUAL, "def")
    );
    verifyFilterList(expr,
        TimelineReaderWebServicesUtils.parseEventFilters(expr), expectedList);

    expr = "(abc,def)";
    verifyFilterList(expr,
        TimelineReaderWebServicesUtils.parseEventFilters(expr), expectedList);

    expr = "(abc,def) OR (rst, uvx)";
    expectedList = new TimelineFilterList(Operator.OR,
        new TimelineFilterList(
            new TimelineExistsFilter(TimelineCompareOp.EQUAL, "abc"),
            new TimelineExistsFilter(TimelineCompareOp.EQUAL, "def")
        ),
        new TimelineFilterList(
            new TimelineExistsFilter(TimelineCompareOp.EQUAL, "rst"),
            new TimelineExistsFilter(TimelineCompareOp.EQUAL, "uvx")
        )
    );
    verifyFilterList(expr,
        TimelineReaderWebServicesUtils.parseEventFilters(expr), expectedList);

    expr = "!(abc,def,uvc) OR (rst, uvx)";
    expectedList = new TimelineFilterList(Operator.OR,
        new TimelineFilterList(
            new TimelineExistsFilter(TimelineCompareOp.NOT_EQUAL, "abc"),
            new TimelineExistsFilter(TimelineCompareOp.NOT_EQUAL, "def"),
            new TimelineExistsFilter(TimelineCompareOp.NOT_EQUAL, "uvc")
        ),
        new TimelineFilterList(
            new TimelineExistsFilter(TimelineCompareOp.EQUAL, "rst"),
            new TimelineExistsFilter(TimelineCompareOp.EQUAL, "uvx")
        )
    );
    verifyFilterList(expr,
        TimelineReaderWebServicesUtils.parseEventFilters(expr), expectedList);

    expr = "(((!(abc,def,uvc) OR (rst, uvx)) AND (!(abcdefg) OR !(ghj,tyu)))" +
        " OR ((bcd,tyu) AND uvb))";
    expectedList = new TimelineFilterList(Operator.OR,
        new TimelineFilterList(
            new TimelineFilterList(Operator.OR,
                new TimelineFilterList(
                    new TimelineExistsFilter(
                        TimelineCompareOp.NOT_EQUAL, "abc"),
                    new TimelineExistsFilter(
                        TimelineCompareOp.NOT_EQUAL, "def"),
                    new TimelineExistsFilter(TimelineCompareOp.NOT_EQUAL, "uvc")
                ),
                new TimelineFilterList(
                    new TimelineExistsFilter(TimelineCompareOp.EQUAL, "rst"),
                    new TimelineExistsFilter(TimelineCompareOp.EQUAL, "uvx")
                )
            ),
            new TimelineFilterList(Operator.OR,
                new TimelineFilterList(
                    new TimelineExistsFilter(
                        TimelineCompareOp.NOT_EQUAL, "abcdefg")
                ),
                new TimelineFilterList(
                    new TimelineExistsFilter(
                        TimelineCompareOp.NOT_EQUAL, "ghj"),
                    new TimelineExistsFilter(
                        TimelineCompareOp.NOT_EQUAL, "tyu")
                )
            )
        ),
        new TimelineFilterList(
            new TimelineFilterList(
                new TimelineExistsFilter(TimelineCompareOp.EQUAL, "bcd"),
                new TimelineExistsFilter(TimelineCompareOp.EQUAL, "tyu")
            ),
            new TimelineExistsFilter(TimelineCompareOp.EQUAL, "uvb")
        )
    );
    verifyFilterList(expr,
        TimelineReaderWebServicesUtils.parseEventFilters(expr), expectedList);

    expr = "  (  (  (  !  (  abc , def  ,   uvc)   OR   (   rst  ,   uvx )  )" +
        "  AND   (  !  (  abcdefg ) OR  !   (  ghj,  tyu)  ) )  OR   (   (" +
        "   bcd   ,   tyu  )   AND   uvb  )   )";
    verifyFilterList(expr,
        TimelineReaderWebServicesUtils.parseEventFilters(expr), expectedList);

    expr = "(((!(abc,def,uvc) OR (rst, uvx)) AND (!(abcdefg) OR !(ghj,tyu)))" +
        " OR ((bcd,tyu) AND uvb)";
    try {
      TimelineReaderWebServicesUtils.parseEventFilters(expr);
      fail("Improper brackets. Exception should have been thrown");
    } catch (TimelineParseException e){}

    expr = "(((!(abc,def,uvc) (OR (rst, uvx)) AND (!(abcdefg) OR !(ghj,tyu)))" +
        " OR ((bcd,tyu) AND uvb))";
    try {
      TimelineReaderWebServicesUtils.parseEventFilters(expr);
      fail("Unexpected opening bracket. Exception should have been thrown");
    } catch (TimelineParseException e){}

    expr = "(((!(abc,def,uvc) OR) (rst, uvx)) AND (!(abcdefg) OR !(ghj,tyu)))" +
        " OR ((bcd,tyu) AND uvb))";
    try {
      TimelineReaderWebServicesUtils.parseEventFilters(expr);
      fail("Unexpected closing bracket. Exception should have been thrown");
    } catch (TimelineParseException e){}

    expr = "(((!(abc,def,uvc) PI (rst, uvx)) AND (!(abcdefg) OR !(ghj,tyu)))" +
        " OR ((bcd,tyu) AND uvb))";
    try {
      TimelineReaderWebServicesUtils.parseEventFilters(expr);
      fail("Invalid op. Exception should have been thrown");
    } catch (TimelineParseException e){}

    expr = "(((!(abc,def,uvc) !OR (rst, uvx)) AND (!(abcdefg) OR !(ghj,tyu)))" +
        " OR ((bcd,tyu) AND uvb))";
    try {
      TimelineReaderWebServicesUtils.parseEventFilters(expr);
      fail("Unexpected ! char. Exception should have been thrown");
    } catch (TimelineParseException e){}

    expr = "abc,def,uvc) OR (rst, uvx)";
    try {
      TimelineReaderWebServicesUtils.parseEventFilters(expr);
      fail("Unexpected closing bracket. Exception should have been thrown");
    } catch (TimelineParseException e){}

    expr = "abc,def,uvc OR )rst, uvx)";
    try {
      TimelineReaderWebServicesUtils.parseEventFilters(expr);
      fail("Unexpected closing bracket. Exception should have been thrown");
    } catch (TimelineParseException e){}

    expr = "abc,def,uvc OR ,rst, uvx)";
    try {
      TimelineReaderWebServicesUtils.parseEventFilters(expr);
      fail("Unexpected delimiter. Exception should have been thrown");
    } catch (TimelineParseException e){}

    expr = "abc,def,uvc OR !  ";
    try {
      TimelineReaderWebServicesUtils.parseEventFilters(expr);
      fail("Unexpected not char. Exception should have been thrown");
    } catch (TimelineParseException e){}

    expr = "(abc,def,uvc)) OR (rst, uvx)";
    try {
      TimelineReaderWebServicesUtils.parseEventFilters(expr);
      fail("Unbalanced brackets. Exception should have been thrown");
    } catch (TimelineParseException e){}

    expr = "(((! ,(abc,def,uvc) OR (rst, uvx)) AND (!(abcdefg) OR !(ghj,tyu" +
        "))) OR ((bcd,tyu) AND uvb))";
    try {
      TimelineReaderWebServicesUtils.parseEventFilters(expr);
      fail("( should follow ! char. Exception should have been thrown");
    } catch (TimelineParseException e){}

    assertNull(TimelineReaderWebServicesUtils.parseEventFilters(null));
    assertNull(TimelineReaderWebServicesUtils.parseEventFilters("   "));
  }

  @Test
  public void testRelationFiltersParsing() throws Exception {
    String expr = "type1:entity11,type2:entity21:entity22";
    TimelineFilterList expectedList = new TimelineFilterList(
        new TimelineKeyValuesFilter(TimelineCompareOp.EQUAL,
            "type1", Sets.newHashSet((Object)"entity11")),
        new TimelineKeyValuesFilter(TimelineCompareOp.EQUAL,
            "type2", Sets.newHashSet((Object)"entity21", "entity22"))
    );
    verifyFilterList(expr, TimelineReaderWebServicesUtils.
        parseRelationFilters(expr), expectedList);

    expr = "(type1:entity11,type2:entity21:entity22)";
    verifyFilterList(expr, TimelineReaderWebServicesUtils.
        parseRelationFilters(expr), expectedList);

    expr = "(type1:entity11,type2:entity21:entity22) OR (type3:entity31:" +
        "entity32:entity33,type1:entity11:entity12)";
    expectedList = new TimelineFilterList(Operator.OR,
        new TimelineFilterList(
            new TimelineKeyValuesFilter(TimelineCompareOp.EQUAL,
                "type1", Sets.newHashSet((Object)"entity11")),
            new TimelineKeyValuesFilter(TimelineCompareOp.EQUAL,
                "type2", Sets.newHashSet((Object)"entity21", "entity22"))
        ),
        new TimelineFilterList(
            new TimelineKeyValuesFilter(TimelineCompareOp.EQUAL,
                "type3", Sets.newHashSet(
                    (Object)"entity31", "entity32", "entity33")),
            new TimelineKeyValuesFilter(TimelineCompareOp.EQUAL,
                "type1", Sets.newHashSet((Object)"entity11", "entity12"))
        )
    );
    verifyFilterList(expr, TimelineReaderWebServicesUtils.
        parseRelationFilters(expr), expectedList);

    expr = "!(type1:entity11,type2:entity21:entity22,type5:entity51) OR " +
        "(type3:entity31:entity32:entity33,type1:entity11:entity12)";

    expectedList = new TimelineFilterList(Operator.OR,
        new TimelineFilterList(
            new TimelineKeyValuesFilter(TimelineCompareOp.NOT_EQUAL,
                "type1", Sets.newHashSet((Object)"entity11")),
            new TimelineKeyValuesFilter(TimelineCompareOp.NOT_EQUAL,
                "type2", Sets.newHashSet((Object)"entity21", "entity22")),
            new TimelineKeyValuesFilter(TimelineCompareOp.NOT_EQUAL,
                "type5", Sets.newHashSet((Object)"entity51"))
        ),
        new TimelineFilterList(
            new TimelineKeyValuesFilter(TimelineCompareOp.EQUAL,
                "type3", Sets.newHashSet(
                    (Object)"entity31", "entity32", "entity33")),
            new TimelineKeyValuesFilter(TimelineCompareOp.EQUAL,
                "type1", Sets.newHashSet((Object)"entity11", "entity12"))
        )
    );
    verifyFilterList(expr, TimelineReaderWebServicesUtils.
        parseRelationFilters(expr), expectedList);

    expr = "(((!(type1:entity11,type2:entity21:entity22,type5:entity51) OR " +
        "(type3:entity31:entity32:entity33,type1:entity11:entity12)) AND "+
        "(!(type11:entity111) OR !(type4:entity43:entity44:entity47:entity49," +
        "type7:entity71))) OR ((type2:entity2,type8:entity88) AND t9:e:e1))";
    expectedList = new TimelineFilterList(Operator.OR,
        new TimelineFilterList(
            new TimelineFilterList(Operator.OR,
                new TimelineFilterList(
                    new TimelineKeyValuesFilter(TimelineCompareOp.NOT_EQUAL,
                        "type1", Sets.newHashSet((Object)"entity11")),
                    new TimelineKeyValuesFilter(TimelineCompareOp.NOT_EQUAL,
                        "type2", Sets.newHashSet(
                            (Object)"entity21", "entity22")),
                    new TimelineKeyValuesFilter(TimelineCompareOp.NOT_EQUAL,
                        "type5", Sets.newHashSet((Object)"entity51"))
                ),
                new TimelineFilterList(
                    new TimelineKeyValuesFilter(TimelineCompareOp.EQUAL,
                        "type3", Sets.newHashSet(
                            (Object)"entity31", "entity32", "entity33")),
                    new TimelineKeyValuesFilter(TimelineCompareOp.EQUAL,
                        "type1", Sets.newHashSet(
                            (Object)"entity11", "entity12"))
                )
            ),
            new TimelineFilterList(Operator.OR,
                new TimelineFilterList(
                    new TimelineKeyValuesFilter(TimelineCompareOp.NOT_EQUAL,
                        "type11", Sets.newHashSet((Object)"entity111"))
                ),
                new TimelineFilterList(
                    new TimelineKeyValuesFilter(TimelineCompareOp.NOT_EQUAL,
                        "type4", Sets.newHashSet((Object)"entity43", "entity44",
                            "entity47", "entity49")),
                    new TimelineKeyValuesFilter(TimelineCompareOp.NOT_EQUAL,
                        "type7", Sets.newHashSet((Object)"entity71"))
                )
            )
        ),
        new TimelineFilterList(
            new TimelineFilterList(
                new TimelineKeyValuesFilter(TimelineCompareOp.EQUAL,
                    "type2", Sets.newHashSet((Object)"entity2")),
                new TimelineKeyValuesFilter(TimelineCompareOp.EQUAL,
                    "type8", Sets.newHashSet((Object)"entity88"))
            ),
            new TimelineKeyValuesFilter(TimelineCompareOp.EQUAL, "t9",
                Sets.newHashSet((Object)"e", "e1"))
        )
    );
    verifyFilterList(expr, TimelineReaderWebServicesUtils.
        parseRelationFilters(expr), expectedList);

    expr = "   (   (  (   !   (   type1:entity11  ,  type2:entity21:entity22" +
        "  ,  type5:entity51  )   OR  (   type3:entity31:entity32:entity33  " +
        "     ,   type1:entity11:entity12)) AND (!(  type11:entity111  )  OR " +
        "    !   (   type4:entity43:entity44:entity47:entity49 , " +
        "type7:entity71  )  )  ) OR  (  (  type2:entity2 , type8:entity88) " +
        "AND  t9:e:e1 )    ) ";
    verifyFilterList(expr, TimelineReaderWebServicesUtils.
        parseRelationFilters(expr), expectedList);

    expr = "(((!(type1 : entity11,type2:entity21:entity22,type5:entity51) OR " +
        "(type3:entity31:entity32:entity33,type1:entity11:entity12)) AND "+
        "(!(type11:entity111) OR !(type4:entity43:entity44:entity47:entity49," +
        "type7:entity71))) OR ((type2:entity2,type8:entity88) AND t9:e:e1))";
    try {
      TimelineReaderWebServicesUtils.parseRelationFilters(expr);
      fail("Space not allowed in relation expression. Exception should have " +
          "been thrown");
    } catch (TimelineParseException e){}
  }

  @Test
  public void testDataToRetrieve() throws Exception {
    String expr = "abc,def";
    TimelineFilterList expectedList = new TimelineFilterList(Operator.OR,
        new TimelinePrefixFilter(TimelineCompareOp.EQUAL, "abc"),
        new TimelinePrefixFilter(TimelineCompareOp.EQUAL, "def")
    );
    verifyFilterList(expr,
        TimelineReaderWebServicesUtils.parseDataToRetrieve(expr), expectedList);

    expr = "(abc,def)";
    verifyFilterList(expr,
        TimelineReaderWebServicesUtils.parseDataToRetrieve(expr), expectedList);

    expr = "   (   abc  ,   def  )   ";
    verifyFilterList(expr,
        TimelineReaderWebServicesUtils.parseDataToRetrieve(expr), expectedList);

    expr = "    abc  ,   def   ";
    verifyFilterList(expr,
        TimelineReaderWebServicesUtils.parseDataToRetrieve(expr), expectedList);

    expr = "!(abc,def)";
    expectedList = new TimelineFilterList(
        new TimelinePrefixFilter(TimelineCompareOp.NOT_EQUAL, "abc"),
        new TimelinePrefixFilter(TimelineCompareOp.NOT_EQUAL, "def")
    );
    verifyFilterList(expr,
        TimelineReaderWebServicesUtils.parseDataToRetrieve(expr), expectedList);

    expr = " !  (   abc  ,  def  )  ";
    verifyFilterList(expr,
        TimelineReaderWebServicesUtils.parseDataToRetrieve(expr), expectedList);

    expr = "!(abc)";
    expectedList = new TimelineFilterList(
        new TimelinePrefixFilter(TimelineCompareOp.NOT_EQUAL, "abc")
    );
    verifyFilterList(expr,
        TimelineReaderWebServicesUtils.parseDataToRetrieve(expr), expectedList);

    expr = "(abc)";
    expectedList = new TimelineFilterList(Operator.OR,
        new TimelinePrefixFilter(TimelineCompareOp.EQUAL, "abc")
    );
    verifyFilterList(expr,
        TimelineReaderWebServicesUtils.parseDataToRetrieve(expr), expectedList);

    expr = "abc";
    verifyFilterList(expr,
        TimelineReaderWebServicesUtils.parseDataToRetrieve(expr), expectedList);

    expr = " !  (   abc  ,  def  , xyz)  ";
    expectedList = new TimelineFilterList(
        new TimelinePrefixFilter(TimelineCompareOp.NOT_EQUAL, "abc"),
        new TimelinePrefixFilter(TimelineCompareOp.NOT_EQUAL, "def"),
        new TimelinePrefixFilter(TimelineCompareOp.NOT_EQUAL, "xyz")
    );
    verifyFilterList(expr,
        TimelineReaderWebServicesUtils.parseDataToRetrieve(expr), expectedList);

    expr = "!(abc,def,xyz)";
    verifyFilterList(expr,
        TimelineReaderWebServicesUtils.parseDataToRetrieve(expr), expectedList);

    expr = "!(abc,def,xyz";
    try {
      TimelineReaderWebServicesUtils.parseDataToRetrieve(expr);
      fail("No closing bracket. Exception should have been thrown");
    } catch (TimelineParseException e){}

    expr = "!abc,def,xyz";
    try {
      TimelineReaderWebServicesUtils.parseDataToRetrieve(expr);
      fail("NOT(!) should be followed by opening bracket. Exception should " +
          "have been thrown");
    } catch (TimelineParseException e){}

    expr = "!abc,def,xyz";
    try {
      TimelineReaderWebServicesUtils.parseDataToRetrieve(expr);
      fail("NOT(!) should be followed by opening bracket. Exception should " +
          "have been thrown");
    } catch (TimelineParseException e){}

    expr = "!   r(  abc,def,xyz)";
    try {
      TimelineReaderWebServicesUtils.parseDataToRetrieve(expr);
      fail("NOT(!) should be followed by opening bracket. Exception should " +
          "have been thrown");
    } catch (TimelineParseException e){}

    assertNull(TimelineReaderWebServicesUtils.parseDataToRetrieve(null));
    assertNull(TimelineReaderWebServicesUtils.parseDataToRetrieve("     "));
    assertNull(TimelineReaderWebServicesUtils.parseDataToRetrieve("()"));
    assertNull(TimelineReaderWebServicesUtils.parseDataToRetrieve("!()"));
    assertNull(TimelineReaderWebServicesUtils.parseDataToRetrieve("(     )"));
    assertNull(TimelineReaderWebServicesUtils.parseDataToRetrieve("!(   )"));
    assertNull(TimelineReaderWebServicesUtils.parseDataToRetrieve("!  (   )"));
  }
}
