br.com.binarti.simplesearchexpr.SimpleSearchParserTest.java Source code

Java tutorial

Introduction

Here is the source code for br.com.binarti.simplesearchexpr.SimpleSearchParserTest.java

Source

/***
 * Copyright (c) 2014 Binar tecnologia da informao - www.binarti.com.br All rights reserved.
 * 
 * Licensed 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 br.com.binarti.simplesearchexpr;

import static java.util.Arrays.asList;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;

import java.text.ParseException;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang3.time.DateUtils;
import org.junit.Test;

import br.com.binarti.simplesearchexpr.DefaultOperatorResolver;
import br.com.binarti.simplesearchexpr.OperatorResolver;
import br.com.binarti.simplesearchexpr.SimpleSearchExpression;
import br.com.binarti.simplesearchexpr.SimpleSearchExpressionField;
import br.com.binarti.simplesearchexpr.SimpleSearchExpressionPlan;
import br.com.binarti.simplesearchexpr.SimpleSearchParser;
import br.com.binarti.simplesearchexpr.SimpleSearchRelationalOperation;
import br.com.binarti.simplesearchexpr.SimpleSearchRelationalOperator;
import br.com.binarti.simplesearchexpr.converter.StringNumericSearchDataConverter;
import br.com.binarti.simplesearchexpr.test.OperationType;

public class SimpleSearchParserTest {

    @Test
    public void shouldParseSimpleSearchExpressionWithOneField() {
        SimpleSearchParser parser = new SimpleSearchParser(
                new SimpleSearchExpressionPlan(new SimpleSearchExpressionField("name", String.class)));
        SimpleSearchExpression expr = parser.parse("name:jason ");

        assertEquals(1, expr.getOperations().size());

        final SimpleSearchRelationalOperation relationalOperation = expr.getOperations().get(0);
        assertEquals("name", relationalOperation.getField().getName());
        assertEquals("name", relationalOperation.getField().getFieldExpr());
        assertEquals(SimpleSearchRelationalOperator.LIKE, relationalOperation.getOperator());
        assertEquals("jason", relationalOperation.getValue());
    }

    @Test
    public void shouldParseSimpleSearchExpressionWithTwoFields() throws ParseException {
        SimpleSearchParser parser = new SimpleSearchParser(
                new SimpleSearchExpressionPlan(new SimpleSearchExpressionField("id", Integer.class),
                        new SimpleSearchExpressionField("date", Date.class)));
        SimpleSearchExpression expr = parser.parse("id:1 date:10/06/2014");

        assertEquals(2, expr.getOperations().size());

        SimpleSearchRelationalOperation relationalOperation = expr.getOperations().get(0);
        assertEquals("id", relationalOperation.getField().getName());
        assertEquals("id", relationalOperation.getField().getFieldExpr());
        assertEquals(SimpleSearchRelationalOperator.EQUALS, relationalOperation.getOperator());
        assertEquals(1, relationalOperation.getValue());

        relationalOperation = expr.getOperations().get(1);
        assertEquals("date", relationalOperation.getField().getName());
        assertEquals("date", relationalOperation.getField().getFieldExpr());
        assertEquals(SimpleSearchRelationalOperator.EQUALS, relationalOperation.getOperator());
        assertEquals(DateUtils.parseDate("10/06/2014", "dd/MM/yyyy"), relationalOperation.getValue());
    }

    @Test
    public void shouldParseSimpleSearchExpressionWithGroupOfFields() throws ParseException {
        SimpleSearchParser parser = new SimpleSearchParser(
                new SimpleSearchExpressionPlan(new SimpleSearchExpressionField("id", Integer.class),
                        new SimpleSearchExpressionField("date", Date.class),
                        new SimpleSearchExpressionField("value", Double.class),
                        new SimpleSearchExpressionField("operationType", String.class)));
        SimpleSearchExpression expr = parser
                .parse("id:1 date:10/06/2014-13/06/2014 value:100.0 operationType:Input");

        assertEquals(4, expr.getOperations().size());

        SimpleSearchRelationalOperation relationalOperation = expr.getOperations().get(0);
        assertEquals("id", relationalOperation.getField().getName());
        assertEquals(SimpleSearchRelationalOperator.EQUALS, relationalOperation.getOperator());
        assertEquals(1, relationalOperation.getValue());

        relationalOperation = expr.getOperations().get(1);
        assertEquals("date", relationalOperation.getField().getName());
        assertEquals(SimpleSearchRelationalOperator.INTERVAL, relationalOperation.getOperator());
        assertEquals(2, relationalOperation.getValueAsCollection().size());
        assertArrayEquals(
                asList(DateUtils.parseDate("10/06/2014", "dd/MM/yyyy"),
                        DateUtils.parseDate("13/06/2014", "dd/MM/yyyy")).toArray(new Date[0]),
                relationalOperation.getValueAsCollection().toArray(new Date[0]));

        relationalOperation = expr.getOperations().get(2);
        assertEquals("value", relationalOperation.getField().getName());
        assertEquals(SimpleSearchRelationalOperator.EQUALS, relationalOperation.getOperator());
        assertEquals(new Double(100.0), relationalOperation.getValue());

        relationalOperation = expr.getOperations().get(3);
        assertEquals("operationType", relationalOperation.getField().getName());
        assertEquals(SimpleSearchRelationalOperator.LIKE, relationalOperation.getOperator());
        assertEquals("Input", relationalOperation.getValue());
    }

    @Test
    public void shouldParseSimpleSearchExpressionWithInterval() throws ParseException {
        SimpleSearchParser parser = new SimpleSearchParser(
                new SimpleSearchExpressionPlan(new SimpleSearchExpressionField("date", Date.class)));
        SimpleSearchExpression expr = parser.parse("date:01/06/2014-30/06/2014");

        assertEquals(1, expr.getOperations().size());

        SimpleSearchRelationalOperation relationalOperation = expr.getOperations().get(0);
        assertEquals("date", relationalOperation.getField().getName());
        assertEquals(SimpleSearchRelationalOperator.INTERVAL, relationalOperation.getOperator());
        assertEquals(2, relationalOperation.getValueAsCollection().size());
        assertArrayEquals(
                asList(DateUtils.parseDate("01/06/2014", "dd/MM/yyyy"),
                        DateUtils.parseDate("30/06/2014", "dd/MM/yyyy")).toArray(new Date[0]),
                relationalOperation.getValueAsCollection().toArray(new Date[0]));
    }

    @Test
    public void shouldParseSimpleSearchExpressionWithInOperation() {
        SimpleSearchParser parser = new SimpleSearchParser(
                new SimpleSearchExpressionPlan(new SimpleSearchExpressionField("id", Integer.class)));
        SimpleSearchExpression expr = parser.parse("id:1,2,3,4,5");

        assertEquals(1, expr.getOperations().size());

        SimpleSearchRelationalOperation relationalOperation = expr.getOperations().get(0);
        assertEquals("id", relationalOperation.getField().getName());
        assertEquals(SimpleSearchRelationalOperator.LIST, relationalOperation.getOperator());
        assertEquals(5, relationalOperation.getValueAsCollection().size());
        assertArrayEquals(asList(1, 2, 3, 4, 5).toArray(new Integer[0]),
                relationalOperation.getValueAsCollection().toArray(new Integer[0]));
    }

    @Test
    public void shouldParseSimpleSearchExpressionWithEnumField() {
        SimpleSearchParser parser = new SimpleSearchParser(new SimpleSearchExpressionPlan(
                new SimpleSearchExpressionField("operationType", OperationType.class)));
        SimpleSearchExpression expr = parser.parse("operationType:Input");

        assertEquals(1, expr.getOperations().size());

        SimpleSearchRelationalOperation relationalOperation = expr.getOperations().get(0);
        assertEquals("operationType", relationalOperation.getField().getName());
        assertEquals(SimpleSearchRelationalOperator.EQUALS, relationalOperation.getOperator());
        assertEquals(OperationType.Input, relationalOperation.getValue());
    }

    @Test
    public void shouldParseSimpleSearchExpressionWithEnumFieldInOperation() {
        SimpleSearchParser parser = new SimpleSearchParser(new SimpleSearchExpressionPlan(
                new SimpleSearchExpressionField("operationType", OperationType.class)));
        SimpleSearchExpression expr = parser.parse("operationType:Input, Output");

        assertEquals(1, expr.getOperations().size());

        SimpleSearchRelationalOperation relationalOperation = expr.getOperations().get(0);
        assertEquals("operationType", relationalOperation.getField().getName());
        assertEquals(SimpleSearchRelationalOperator.LIST, relationalOperation.getOperator());
        assertArrayEquals(asList(OperationType.Input, OperationType.Output).toArray(new OperationType[0]),
                relationalOperation.getValueAsCollection().toArray(new OperationType[0]));
    }

    @Test
    @SuppressWarnings("serial")
    public void shouldParseSimpleSearchExpressionDateWithCustomPatterns() throws Exception {
        final Map<String, Object> dateFieldParams = new HashMap<String, Object>() {
            {
                put("pattern", Arrays.asList("dd/MM/yyyy", "yyyyMMdd"));
            }
        };
        SimpleSearchParser parser = new SimpleSearchParser(new SimpleSearchExpressionPlan(
                new SimpleSearchExpressionField("date", Date.class, dateFieldParams)));
        SimpleSearchExpression expr = parser.parse("date:01/06/2014-20140630");

        assertEquals(1, expr.getOperations().size());

        SimpleSearchRelationalOperation relationalOperation = expr.getOperations().get(0);
        assertEquals("date", relationalOperation.getField().getName());
        assertEquals(SimpleSearchRelationalOperator.INTERVAL, relationalOperation.getOperator());
        assertEquals(2, relationalOperation.getValueAsCollection().size());
        assertArrayEquals(
                asList(DateUtils.parseDate("01/06/2014", "dd/MM/yyyy"),
                        DateUtils.parseDate("30/06/2014", "dd/MM/yyyy")).toArray(new Date[0]),
                relationalOperation.getValueAsCollection().toArray(new Date[0]));
    }

    @Test
    @SuppressWarnings("serial")
    public void shouldParseSimpleSearchExpressionCustomConverter() throws Exception {
        final Map<String, Object> params = new HashMap<String, Object>() {
            {
                put("size", 6);
            }
        };
        SimpleSearchParser parser = new SimpleSearchParser(
                new SimpleSearchExpressionPlan(new SimpleSearchExpressionField("id", String.class,
                        new StringNumericSearchDataConverter(), params)));
        SimpleSearchExpression expr = parser.parse("id:1a.");

        assertEquals(1, expr.getOperations().size());

        SimpleSearchRelationalOperation relationalOperation = expr.getOperations().get(0);
        assertEquals("id", relationalOperation.getField().getName());
        assertEquals(SimpleSearchRelationalOperator.LIKE, relationalOperation.getOperator());
        assertEquals("000001", relationalOperation.getValue());
    }

    @Test
    @SuppressWarnings("serial")
    public void shouldParseSimpleSearchExpressionCustomOperatorResolver() throws Exception {
        final Map<String, Object> params = new HashMap<String, Object>() {
            {
                put("size", 6);
            }
        };
        OperatorResolver operatorResolver = new DefaultOperatorResolver() {
            @Override
            public SimpleSearchRelationalOperator resolveOperator(Class<?> fieldType, String value,
                    SimpleSearchExpressionField field) {
                String fieldName = field.getName();
                if (fieldName.equals("id")) {
                    if (isListOperator(value, fieldType)) {
                        return SimpleSearchRelationalOperator.LIST;
                    }
                }
                return super.resolveOperator(fieldType, value, field);
            }
        };
        SimpleSearchParser parser = new SimpleSearchParser(
                new SimpleSearchExpressionPlan(operatorResolver, new SimpleSearchExpressionField("id", String.class,
                        new StringNumericSearchDataConverter(), params)));
        SimpleSearchExpression expr = parser.parse("id:1,2,3,4,5");

        assertEquals(1, expr.getOperations().size());

        SimpleSearchRelationalOperation relationalOperation = expr.getOperations().get(0);
        assertEquals("id", relationalOperation.getField().getName());
        assertEquals(SimpleSearchRelationalOperator.LIST, relationalOperation.getOperator());
        assertArrayEquals(asList("000001", "000002", "000003", "000004", "000005").toArray(new String[0]),
                relationalOperation.getValueAsCollection().toArray(new String[0]));
    }

    @Test
    public void shouldParseSimpleSearchExpressionInOperatorWithPrimitiveField() throws Exception {
        SimpleSearchParser parser = new SimpleSearchParser(
                new SimpleSearchExpressionPlan(new SimpleSearchExpressionField("id", int.class)));
        SimpleSearchExpression expr = parser.parse("id:1,2,3,4,5");

        assertEquals(1, expr.getOperations().size());

        SimpleSearchRelationalOperation relationalOperation = expr.getOperations().get(0);
        assertEquals("id", relationalOperation.getField().getName());
        assertEquals(SimpleSearchRelationalOperator.LIST, relationalOperation.getOperator());
        assertArrayEquals(asList(1, 2, 3, 4, 5).toArray(new Integer[0]),
                relationalOperation.getValueAsCollection().toArray(new Integer[0]));
    }

    @Test
    public void shouldParseSimpleSearchExpressionCustomFieldExpr() throws Exception {
        SimpleSearchParser parser = new SimpleSearchParser(new SimpleSearchExpressionPlan(
                new SimpleSearchExpressionField("name", "metadata.name", String.class)));
        SimpleSearchExpression expr = parser.parse("name:john");

        assertEquals(1, expr.getOperations().size());

        SimpleSearchRelationalOperation relationalOperation = expr.getOperations().get(0);
        assertEquals("name", relationalOperation.getField().getName());
        assertEquals("metadata.name", relationalOperation.getField().getFieldExpr());
        assertEquals(SimpleSearchRelationalOperator.LIKE, relationalOperation.getOperator());
        assertEquals("john", relationalOperation.getValue());
    }

    @Test
    @SuppressWarnings("serial")
    public void shouldParseSimpleSearchExpressionResolvingDefaultFieldWithDefaultOption() {
        final Map<String, String> defaults = new HashMap<String, String>() {
            {
                put("__default__", "name");
                put("id", "^[0-9]{1,10}$");
            }
        };
        final List<SimpleSearchExpressionField> fields = asList(
                new SimpleSearchExpressionField("name", String.class),
                new SimpleSearchExpressionField("id", Integer.class));
        SimpleSearchParser parser = new SimpleSearchParser(
                new SimpleSearchExpressionPlan(defaults, fields.toArray(new SimpleSearchExpressionField[0])));
        SimpleSearchExpression expr = parser.parse("john");

        assertEquals(1, expr.getOperations().size());

        SimpleSearchRelationalOperation relationalOperation = expr.getOperations().get(0);
        assertEquals("name", relationalOperation.getField().getName());
        assertEquals(SimpleSearchRelationalOperator.LIKE, relationalOperation.getOperator());
        assertEquals("john", relationalOperation.getValue());

        expr = parser.parse("150");

        assertEquals(1, expr.getOperations().size());

        relationalOperation = expr.getOperations().get(0);
        assertEquals("id", relationalOperation.getField().getName());
        assertEquals(SimpleSearchRelationalOperator.EQUALS, relationalOperation.getOperator());
        assertEquals(new Integer(150), relationalOperation.getValue());
    }

    @Test
    @SuppressWarnings("serial")
    public void shouldParseSimpleSearchExpressionResolvingDefaultField() {
        final Map<String, String> defaults = new HashMap<String, String>() {
            {
                put("__default__", "name");
                put("id", "^[0-9]{1,10}$");
            }
        };
        final List<SimpleSearchExpressionField> fields = asList(
                new SimpleSearchExpressionField("name", String.class),
                new SimpleSearchExpressionField("id", Integer.class));
        SimpleSearchParser parser = new SimpleSearchParser(
                new SimpleSearchExpressionPlan(defaults, fields.toArray(new SimpleSearchExpressionField[0])));
        SimpleSearchExpression expr = parser.parse("12345");

        assertEquals(1, expr.getOperations().size());

        SimpleSearchRelationalOperation relationalOperation = expr.getOperations().get(0);
        assertEquals("id", relationalOperation.getField().getName());
        assertEquals(SimpleSearchRelationalOperator.EQUALS, relationalOperation.getOperator());
        assertEquals(new Integer(12345), relationalOperation.getValue());
    }

    @Test
    @SuppressWarnings("serial")
    public void shouldParseSimpleSearchExpressionResolvingDefaultFieldMultipleDefaultsConfigured() {
        final Map<String, String> defaults = new HashMap<String, String>() {
            {
                put("__default__", "name");
                put("id", "^[0-9]{1,8}$");
                put("cpfCnpj", "^[0-9]{9,14}$");
            }
        };
        final List<SimpleSearchExpressionField> fields = asList(
                new SimpleSearchExpressionField("name", String.class),
                new SimpleSearchExpressionField("id", Integer.class),
                new SimpleSearchExpressionField("cpfCnpj", String.class));
        SimpleSearchParser parser = new SimpleSearchParser(
                new SimpleSearchExpressionPlan(defaults, fields.toArray(new SimpleSearchExpressionField[0])));
        SimpleSearchExpression expr = parser.parse("15556615000176");

        assertEquals(1, expr.getOperations().size());

        SimpleSearchRelationalOperation relationalOperation = expr.getOperations().get(0);
        assertEquals("cpfCnpj", relationalOperation.getField().getName());
        assertEquals(SimpleSearchRelationalOperator.LIKE, relationalOperation.getOperator());
        assertEquals("15556615000176", relationalOperation.getValue());
    }

    @Test
    public void shouldParseSimpleSearchExpressionWithSpacesInValueAndOneField() {
        SimpleSearchParser parser = new SimpleSearchParser(
                new SimpleSearchExpressionPlan(new SimpleSearchExpressionField("name", String.class)));
        SimpleSearchExpression expr = parser.parse("name:john galt");

        assertEquals(1, expr.getOperations().size());

        final SimpleSearchRelationalOperation relationalOperation = expr.getOperations().get(0);
        assertEquals("name", relationalOperation.getField().getName());
        assertEquals("name", relationalOperation.getField().getFieldExpr());
        assertEquals(SimpleSearchRelationalOperator.LIKE, relationalOperation.getOperator());
        assertEquals("john galt", relationalOperation.getValue());
    }

    @Test
    public void shouldParseSimpleSearchExpressionWithSpacesInValueAndMultiplesFields() {
        SimpleSearchParser parser = new SimpleSearchParser(
                new SimpleSearchExpressionPlan(new SimpleSearchExpressionField("id", Integer.class),
                        new SimpleSearchExpressionField("name", String.class),
                        new SimpleSearchExpressionField("age", Integer.class),
                        new SimpleSearchExpressionField("type", String.class)));
        SimpleSearchExpression expr = parser.parse("id:10 name:john galt and dagny taggart age:31 type:(1)sci-fi");

        assertEquals(4, expr.getOperations().size());

        SimpleSearchRelationalOperation relationalOperation = expr.getOperations().get(0);
        assertEquals("id", relationalOperation.getField().getName());
        assertEquals(SimpleSearchRelationalOperator.EQUALS, relationalOperation.getOperator());
        assertEquals(new Integer(10), relationalOperation.getValue());

        relationalOperation = expr.getOperations().get(1);
        assertEquals("name", relationalOperation.getField().getName());
        assertEquals("name", relationalOperation.getField().getFieldExpr());
        assertEquals(SimpleSearchRelationalOperator.LIKE, relationalOperation.getOperator());
        assertEquals("john galt and dagny taggart", relationalOperation.getValue());

        relationalOperation = expr.getOperations().get(2);
        assertEquals("age", relationalOperation.getField().getName());
        assertEquals(SimpleSearchRelationalOperator.EQUALS, relationalOperation.getOperator());
        assertEquals(new Integer(31), relationalOperation.getValue());

        relationalOperation = expr.getOperations().get(3);
        assertEquals("type", relationalOperation.getField().getName());
        assertEquals(SimpleSearchRelationalOperator.LIKE, relationalOperation.getOperator());
        assertEquals("(1)sci-fi", relationalOperation.getValue());
    }

    @Test
    public void shouldParseSimpleSearchExpressionUsingCustomDefaultOperator() {
        SimpleSearchParser parser = new SimpleSearchParser(new SimpleSearchExpressionPlan(
                new SimpleSearchExpressionField("name", String.class, SimpleSearchRelationalOperator.EQUALS)));
        SimpleSearchExpression expr = parser.parse("name:john galt");

        assertEquals(1, expr.getOperations().size());

        final SimpleSearchRelationalOperation relationalOperation = expr.getOperations().get(0);
        assertEquals("name", relationalOperation.getField().getName());
        assertEquals("name", relationalOperation.getField().getFieldExpr());
        assertEquals(SimpleSearchRelationalOperator.EQUALS, relationalOperation.getOperator());
        assertEquals("john galt", relationalOperation.getValue());
    }

}