/* * Copyright 2013 Future Systems * * 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 org.araqne.logdb.query.parser; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; import java.util.Calendar; import java.util.Date; import org.araqne.logdb.QueryParseException; import org.araqne.logdb.QueryParserService; import org.araqne.logdb.Row; import org.araqne.logdb.TimeSpan; import org.araqne.logdb.TimeUnit; import org.araqne.logdb.query.aggregator.AggregationField; import org.araqne.logdb.query.command.Timechart; import org.araqne.logdb.query.engine.QueryParserServiceImpl; import org.araqne.logdb.query.expr.Expression; import org.junit.Test; public class TimechartParserTest { private QueryParserService queryParserService = new QueryParserServiceImpl(); @Test public void testInsufficientCommand() { TimechartParser p = new TimechartParser(); p.setQueryParserService(queryParserService); String query = "timecahrt"; try { p.parse(null, query); fail(); } catch (QueryParseException e) { if(e.isDebugMode()){ System.out.println("query " + query); System.out.println(e.getMessage()); } assertEquals("21800", e.getType()); assertEquals(10, e.getStartOffset()); assertEquals(8, e.getEndOffset()); } } @Test public void testMostSimpleCase() { TimechartParser p = new TimechartParser(); p.setQueryParserService(queryParserService); Timechart tc = (Timechart) p.parse(null, "timechart count"); assertEquals(1, tc.getAggregationFields().size()); assertEquals("count", tc.getAggregationFields().get(0).getName()); assertEquals(1, tc.getTimeSpan().amount); assertEquals(TimeUnit.Day, tc.getTimeSpan().unit); assertEquals("timechart span=1d count", tc.toString()); } @Test public void testCount() { TimechartParser p = new TimechartParser(); p.setQueryParserService(queryParserService); Timechart tc = (Timechart) p.parse(null, "timechart span=1d count"); assertEquals(1, tc.getAggregationFields().size()); assertEquals("count", tc.getAggregationFields().get(0).getName()); assertEquals(1, tc.getTimeSpan().amount); assertEquals(TimeUnit.Day, tc.getTimeSpan().unit); assertEquals("timechart span=1d count", tc.toString()); } @Test public void testCountWithClause() { TimechartParser p = new TimechartParser(); p.setQueryParserService(queryParserService); Timechart tc = (Timechart) p.parse(null, "timechart span=1d count by sip"); assertEquals(1, tc.getAggregationFields().size()); assertEquals("count", tc.getAggregationFields().get(0).getName()); assertEquals(1, tc.getTimeSpan().amount); assertEquals(TimeUnit.Day, tc.getTimeSpan().unit); assertEquals("sip", tc.getKeyField()); assertEquals("timechart span=1d count by sip", tc.toString()); } @Test public void testNestedSum() { TimechartParser p = new TimechartParser(); p.setQueryParserService(queryParserService); Timechart tc = (Timechart) p.parse(null, "timechart span=1m sum(sport / 2)"); AggregationField agg = tc.getAggregationFields().get(0); assertEquals(1, tc.getAggregationFields().size()); assertEquals("sum((sport / 2))", agg.getName()); Expression arg1 = agg.getFunction().getArguments().get(0); Row m = new Row(); m.put("sport", 100); assertEquals(50.0, arg1.eval(m)); assertEquals("timechart span=1m sum((sport / 2))", tc.toString()); } @Test public void test2MonthBucketing() { TimeSpan mon2 = new TimeSpan(2, TimeUnit.Month); assertEquals(date(2013, 1, 1), TimeUnit.getKey(date(2013, 1, 2), mon2)); assertEquals(date(2013, 1, 1), TimeUnit.getKey(date(2013, 2, 2), mon2)); assertEquals(date(2013, 3, 1), TimeUnit.getKey(date(2013, 3, 2), mon2)); assertEquals(date(2013, 3, 1), TimeUnit.getKey(date(2013, 4, 2), mon2)); assertEquals(date(2013, 5, 1), TimeUnit.getKey(date(2013, 5, 2), mon2)); assertEquals(date(2013, 5, 1), TimeUnit.getKey(date(2013, 6, 2), mon2)); assertEquals(date(2013, 7, 1), TimeUnit.getKey(date(2013, 7, 2), mon2)); assertEquals(date(2013, 7, 1), TimeUnit.getKey(date(2013, 8, 2), mon2)); assertEquals(date(2013, 9, 1), TimeUnit.getKey(date(2013, 9, 2), mon2)); assertEquals(date(2013, 9, 1), TimeUnit.getKey(date(2013, 10, 2), mon2)); assertEquals(date(2013, 11, 1), TimeUnit.getKey(date(2013, 11, 2), mon2)); assertEquals(date(2013, 11, 1), TimeUnit.getKey(date(2013, 12, 2), mon2)); } @Test public void test3MonthBucketing() { TimeSpan mon3 = new TimeSpan(3, TimeUnit.Month); assertEquals(date(2013, 1, 1), TimeUnit.getKey(date(2013, 1, 2), mon3)); assertEquals(date(2013, 1, 1), TimeUnit.getKey(date(2013, 2, 2), mon3)); assertEquals(date(2013, 1, 1), TimeUnit.getKey(date(2013, 3, 2), mon3)); assertEquals(date(2013, 4, 1), TimeUnit.getKey(date(2013, 4, 2), mon3)); assertEquals(date(2013, 4, 1), TimeUnit.getKey(date(2013, 5, 2), mon3)); assertEquals(date(2013, 4, 1), TimeUnit.getKey(date(2013, 6, 2), mon3)); assertEquals(date(2013, 7, 1), TimeUnit.getKey(date(2013, 7, 2), mon3)); assertEquals(date(2013, 7, 1), TimeUnit.getKey(date(2013, 8, 2), mon3)); assertEquals(date(2013, 7, 1), TimeUnit.getKey(date(2013, 9, 2), mon3)); assertEquals(date(2013, 10, 1), TimeUnit.getKey(date(2013, 10, 2), mon3)); assertEquals(date(2013, 10, 1), TimeUnit.getKey(date(2013, 11, 2), mon3)); assertEquals(date(2013, 10, 1), TimeUnit.getKey(date(2013, 12, 2), mon3)); } @Test public void test4MonthBucketing() { TimeSpan mon4 = new TimeSpan(4, TimeUnit.Month); assertEquals(date(2013, 1, 1), TimeUnit.getKey(date(2013, 1, 2), mon4)); assertEquals(date(2013, 1, 1), TimeUnit.getKey(date(2013, 2, 2), mon4)); assertEquals(date(2013, 1, 1), TimeUnit.getKey(date(2013, 3, 2), mon4)); assertEquals(date(2013, 1, 1), TimeUnit.getKey(date(2013, 4, 2), mon4)); assertEquals(date(2013, 5, 1), TimeUnit.getKey(date(2013, 5, 2), mon4)); assertEquals(date(2013, 5, 1), TimeUnit.getKey(date(2013, 6, 2), mon4)); assertEquals(date(2013, 5, 1), TimeUnit.getKey(date(2013, 7, 2), mon4)); assertEquals(date(2013, 5, 1), TimeUnit.getKey(date(2013, 8, 2), mon4)); assertEquals(date(2013, 9, 1), TimeUnit.getKey(date(2013, 9, 2), mon4)); assertEquals(date(2013, 9, 1), TimeUnit.getKey(date(2013, 10, 2), mon4)); assertEquals(date(2013, 9, 1), TimeUnit.getKey(date(2013, 11, 2), mon4)); assertEquals(date(2013, 9, 1), TimeUnit.getKey(date(2013, 12, 2), mon4)); } @Test public void test6MonthBucketing() { TimeSpan mon6 = new TimeSpan(6, TimeUnit.Month); assertEquals(date(2013, 1, 1), TimeUnit.getKey(date(2013, 1, 2), mon6)); assertEquals(date(2013, 1, 1), TimeUnit.getKey(date(2013, 2, 2), mon6)); assertEquals(date(2013, 1, 1), TimeUnit.getKey(date(2013, 3, 2), mon6)); assertEquals(date(2013, 1, 1), TimeUnit.getKey(date(2013, 4, 2), mon6)); assertEquals(date(2013, 1, 1), TimeUnit.getKey(date(2013, 5, 2), mon6)); assertEquals(date(2013, 1, 1), TimeUnit.getKey(date(2013, 6, 2), mon6)); assertEquals(date(2013, 7, 1), TimeUnit.getKey(date(2013, 7, 2), mon6)); assertEquals(date(2013, 7, 1), TimeUnit.getKey(date(2013, 8, 2), mon6)); assertEquals(date(2013, 7, 1), TimeUnit.getKey(date(2013, 9, 2), mon6)); assertEquals(date(2013, 7, 1), TimeUnit.getKey(date(2013, 10, 2), mon6)); assertEquals(date(2013, 7, 1), TimeUnit.getKey(date(2013, 11, 2), mon6)); assertEquals(date(2013, 7, 1), TimeUnit.getKey(date(2013, 12, 2), mon6)); } @Test public void test1YearBucketing() { TimeSpan mon6 = new TimeSpan(1, TimeUnit.Year); assertEquals(date(2013, 1, 1), TimeUnit.getKey(date(2013, 1, 2), mon6)); assertEquals(date(2013, 1, 1), TimeUnit.getKey(date(2013, 2, 2), mon6)); assertEquals(date(2013, 1, 1), TimeUnit.getKey(date(2013, 3, 2), mon6)); assertEquals(date(2013, 1, 1), TimeUnit.getKey(date(2013, 4, 2), mon6)); assertEquals(date(2013, 1, 1), TimeUnit.getKey(date(2013, 5, 2), mon6)); assertEquals(date(2013, 1, 1), TimeUnit.getKey(date(2013, 6, 2), mon6)); assertEquals(date(2014, 1, 1), TimeUnit.getKey(date(2014, 7, 2), mon6)); assertEquals(date(2014, 1, 1), TimeUnit.getKey(date(2014, 8, 2), mon6)); assertEquals(date(2014, 1, 1), TimeUnit.getKey(date(2014, 9, 2), mon6)); assertEquals(date(2014, 1, 1), TimeUnit.getKey(date(2014, 10, 2), mon6)); assertEquals(date(2014, 1, 1), TimeUnit.getKey(date(2014, 11, 2), mon6)); assertEquals(date(2014, 1, 1), TimeUnit.getKey(date(2014, 12, 2), mon6)); } private Date date(int year, int mon, int day) { Calendar c = Calendar.getInstance(); c.set(Calendar.YEAR, year); c.set(Calendar.MONTH, mon - 1); c.set(Calendar.DAY_OF_MONTH, day); c.set(Calendar.HOUR_OF_DAY, 0); c.set(Calendar.MINUTE, 0); c.set(Calendar.SECOND, 0); c.set(Calendar.MILLISECOND, 0); return c.getTime(); } }