blob: 18f39ef3a1b0bf9856a1b2a1e42158f31c1e65e9 [file] [log] [blame]
/*
* Druid - a distributed column store.
* Copyright (C) 2012 Metamarkets Group Inc.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package com.metamx.druid;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.metamx.druid.jackson.DefaultObjectMapper;
import org.codehaus.jackson.map.ObjectMapper;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.Days;
import org.joda.time.Hours;
import org.joda.time.Minutes;
import org.joda.time.Months;
import org.joda.time.Period;
import org.joda.time.Weeks;
import org.junit.Assert;
import org.junit.Test;
import java.util.Iterator;
import java.util.List;
/**
*/
public class QueryGranularityTest
{
@Test
public void testIterableNone() throws Exception
{
List<Long> millis = Lists.newArrayList(QueryGranularity.NONE.iterable(0, 1000));
int count = 0;
Assert.assertEquals(1000, millis.size());
for (Long milli : millis) {
Assert.assertEquals(count, milli.longValue());
++count;
}
}
@Test
public void testIterableMinuteSimple() throws Exception
{
final DateTime baseTime = new DateTime("2011-01-01T09:38:00.000Z");
assertSame(
Lists.newArrayList(
new DateTime("2011-01-01T09:38:00.000Z"),
new DateTime("2011-01-01T09:39:00.000Z"),
new DateTime("2011-01-01T09:40:00.000Z")
),
QueryGranularity.MINUTE.iterable(baseTime.getMillis(), baseTime.plus(Minutes.THREE).getMillis())
);
}
@Test
public void testIterableMinuteComplex() throws Exception
{
final DateTime baseTime = new DateTime("2011-01-01T09:38:02.992Z");
assertSame(
Lists.newArrayList(
new DateTime("2011-01-01T09:38:00.000Z"),
new DateTime("2011-01-01T09:39:00.000Z"),
new DateTime("2011-01-01T09:40:00.000Z"),
new DateTime("2011-01-01T09:41:00.000Z")
),
QueryGranularity.MINUTE.iterable(baseTime.getMillis(), baseTime.plus(Minutes.THREE).getMillis())
);
}
@Test
public void testIterable15MinuteSimple() throws Exception
{
final DateTime baseTime = new DateTime("2011-01-01T09:30:00.000Z");
assertSame(
Lists.newArrayList(
new DateTime("2011-01-01T09:30:00.000Z"),
new DateTime("2011-01-01T09:45:00.000Z"),
new DateTime("2011-01-01T10:00:00.000Z")
),
QueryGranularity.fromString("FIFTEEN_MINUTE").iterable(
baseTime.getMillis(),
baseTime.plus(Minutes.minutes(45)).getMillis()
)
);
}
@Test
public void testIterable15MinuteComplex() throws Exception
{
final DateTime baseTime = new DateTime("2011-01-01T09:38:02.992Z");
assertSame(
Lists.newArrayList(
new DateTime("2011-01-01T09:30:00.000Z"),
new DateTime("2011-01-01T09:45:00.000Z"),
new DateTime("2011-01-01T10:00:00.000Z"),
new DateTime("2011-01-01T10:15:00.000Z")
),
QueryGranularity.fromString("FIFTEEN_MINUTE").iterable(baseTime.getMillis(), baseTime.plus(Minutes.minutes(45)).getMillis())
);
}
@Test
public void testIterableHourSimple() throws Exception
{
final DateTime baseTime = new DateTime("2011-01-01T09:00:00.000Z");
assertSame(
Lists.newArrayList(
new DateTime("2011-01-01T09:00:00.000Z"),
new DateTime("2011-01-01T10:00:00.000Z"),
new DateTime("2011-01-01T11:00:00.000Z")
),
QueryGranularity.HOUR.iterable(baseTime.getMillis(), baseTime.plus(Hours.hours(3)).getMillis())
);
}
@Test
public void testIterableHourComplex() throws Exception
{
final DateTime baseTime = new DateTime("2011-01-01T09:38:02.992Z");
assertSame(
Lists.newArrayList(
new DateTime("2011-01-01T09:00:00.000Z"),
new DateTime("2011-01-01T10:00:00.000Z"),
new DateTime("2011-01-01T11:00:00.000Z"),
new DateTime("2011-01-01T12:00:00.000Z")
),
QueryGranularity.HOUR.iterable(baseTime.getMillis(), baseTime.plus(Hours.hours(3)).getMillis())
);
}
@Test
public void testIterableDaySimple() throws Exception
{
final DateTime baseTime = new DateTime("2011-01-01T00:00:00.000Z");
assertSame(
Lists.newArrayList(
new DateTime("2011-01-01T00:00:00.000Z"),
new DateTime("2011-01-02T00:00:00.000Z"),
new DateTime("2011-01-03T00:00:00.000Z")
),
QueryGranularity.DAY.iterable(baseTime.getMillis(), baseTime.plus(Days.days(3)).getMillis())
);
}
@Test
public void testIterableDayComplex() throws Exception
{
final DateTime baseTime = new DateTime("2011-01-01T09:38:02.992Z");
assertSame(
Lists.newArrayList(
new DateTime("2011-01-01T00:00:00.000Z"),
new DateTime("2011-01-02T00:00:00.000Z"),
new DateTime("2011-01-03T00:00:00.000Z"),
new DateTime("2011-01-04T00:00:00.000Z")
),
QueryGranularity.DAY.iterable(baseTime.getMillis(), baseTime.plus(Days.days(3)).getMillis())
);
}
//@Test
public void testPeriodDaylightSaving() throws Exception
{
final DateTimeZone tz = DateTimeZone.forID("America/Los_Angeles");
final DateTime baseTime = new DateTime("2012-11-04T00:00:00", tz);
assertSame(
Lists.newArrayList(
new DateTime("2012-11-04T00:00:00.000-07:00"),
new DateTime("2012-11-05T00:00:00.000-08:00"),
new DateTime("2012-11-06T00:00:00.000-08:00")
),
new PeriodGranularity(new Period("P1D"), null, tz)
.iterable(baseTime.getMillis(), baseTime.plus(Days.days(3)).getMillis())
);
assertSame(
Lists.newArrayList(
new DateTime("2012-11-04T00:00:00.000-07:00"),
new DateTime("2012-11-04T01:00:00.000-07:00"),
new DateTime("2012-11-04T01:00:00.000-08:00"),
new DateTime("2012-11-04T02:00:00.000-08:00"),
new DateTime("2012-11-04T03:00:00.000-08:00")
),
new PeriodGranularity(new Period("PT1H"), null, tz)
.iterable(baseTime.getMillis(), baseTime.plus(Hours.hours(5)).getMillis())
);
final QueryGranularity hour = new PeriodGranularity(new Period("PT1H"), null, tz);
assertSame(
Lists.newArrayList(
new DateTime("2012-11-04T00:00:00.000-07:00"),
new DateTime("2012-11-04T01:00:00.000-07:00"),
new DateTime("2012-11-04T01:00:00.000-08:00"),
new DateTime("2012-11-04T02:00:00.000-08:00"),
new DateTime("2012-11-04T03:00:00.000-08:00")
),
Lists.newArrayList(
hour.truncate(new DateTime("2012-11-04T00:30:00-07:00").getMillis()),
hour.truncate(new DateTime("2012-11-04T01:30:00-07:00").getMillis()),
hour.truncate(new DateTime("2012-11-04T01:30:00-08:00").getMillis()),
hour.truncate(new DateTime("2012-11-04T02:30:00-08:00").getMillis()),
hour.truncate(new DateTime("2012-11-04T03:30:00-08:00").getMillis())
)
);
}
@Test
public void testIterableMonth() throws Exception
{
final DateTimeZone tz = DateTimeZone.forID("America/Los_Angeles");
final DateTime baseTime = new DateTime("2012-11-03T10:00:00", tz);
assertSame(
Lists.newArrayList(
new DateTime("2012-11-01T00:00:00.000-07:00"),
new DateTime("2012-12-01T00:00:00.000-08:00"),
new DateTime("2013-01-01T00:00:00.000-08:00"),
new DateTime("2013-02-01T00:00:00.000-08:00")
),
new PeriodGranularity(new Period("P1M"), null, tz)
.iterable(baseTime.getMillis(), baseTime.plus(Months.months(3)).getMillis())
);
}
@Test
public void testIterableWeek() throws Exception
{
final DateTimeZone tz = DateTimeZone.forID("America/Los_Angeles");
final DateTime baseTime = new DateTime("2012-11-03T10:00:00", tz);
assertSame(
Lists.newArrayList(
new DateTime("2012-10-29T00:00:00.000-07:00"),
new DateTime("2012-11-05T00:00:00.000-08:00"),
new DateTime("2012-11-12T00:00:00.000-08:00"),
new DateTime("2012-11-19T00:00:00.000-08:00")
),
new PeriodGranularity(new Period("P1W"), null, tz)
.iterable(baseTime.getMillis(), baseTime.plus(Weeks.weeks(3)).getMillis())
);
assertSame(
Lists.newArrayList(
new DateTime("2012-11-03T10:00:00.000-07:00"),
new DateTime("2012-11-10T10:00:00.000-08:00"),
new DateTime("2012-11-17T10:00:00.000-08:00")
),
new PeriodGranularity(new Period("P1W"), baseTime, tz)
.iterable(baseTime.getMillis(), baseTime.plus(Weeks.weeks(3)).getMillis())
);
}
@Test
public void testPeriodTruncateDays() throws Exception
{
final DateTime origin = new DateTime("2012-01-02T05:00:00.000-08:00");
QueryGranularity periodOrigin = new PeriodGranularity(new Period("P2D"),
origin,
DateTimeZone.forID("America/Los_Angeles"));
assertSame(
Lists.newArrayList(
new DateTime("2011-12-31T05:00:00.000-08:00"),
new DateTime("2012-01-02T05:00:00.000-08:00"),
new DateTime("2012-01-04T05:00:00.000-08:00")
),
Lists.newArrayList(
periodOrigin.truncate(new DateTime("2012-01-01T05:00:04.123-08:00").getMillis()),
periodOrigin.truncate(new DateTime("2012-01-02T07:00:04.123-08:00").getMillis()),
periodOrigin.truncate(new DateTime("2012-01-04T07:20:04.123-08:00").getMillis())
)
);
QueryGranularity periodNoOrigin = new PeriodGranularity(new Period("P2D"),
null,
DateTimeZone.forID("America/Los_Angeles"));
assertSame(
Lists.newArrayList(
new DateTime("2012-01-01T00:00:00.000-08:00"),
new DateTime("2012-01-01T00:00:00.000-08:00"),
new DateTime("2012-01-03T00:00:00.000-08:00")
),
Lists.newArrayList(
periodNoOrigin.truncate(new DateTime("2012-01-01T05:00:04.123-08:00").getMillis()),
periodNoOrigin.truncate(new DateTime("2012-01-02T07:00:04.123-08:00").getMillis()),
periodNoOrigin.truncate(new DateTime("2012-01-04T07:20:04.123-08:00").getMillis())
)
);
}
@Test
public void testPeriodTruncateMinutes() throws Exception
{
final DateTime origin = new DateTime("2012-01-02T00:05:00.000Z");
QueryGranularity periodOrigin = new PeriodGranularity(new Period("PT15M"), origin, null);
assertSame(
Lists.newArrayList(
new DateTime("2012-01-01T04:50:00.000Z"),
new DateTime("2012-01-02T07:05:00.000Z"),
new DateTime("2012-01-04T00:20:00.000Z")
),
Lists.newArrayList(
periodOrigin.truncate(new DateTime("2012-01-01T05:00:04.123Z").getMillis()),
periodOrigin.truncate(new DateTime("2012-01-02T07:08:04.123Z").getMillis()),
periodOrigin.truncate(new DateTime("2012-01-04T00:20:04.123Z").getMillis())
)
);
QueryGranularity periodNoOrigin = new PeriodGranularity(new Period("PT15M"), null, null);
assertSame(
Lists.newArrayList(
new DateTime("2012-01-01T05:00:00.000Z"),
new DateTime("2012-01-02T07:00:00.000Z"),
new DateTime("2012-01-04T00:15:00.000Z")
),
Lists.newArrayList(
periodNoOrigin.truncate(new DateTime("2012-01-01T05:00:04.123Z").getMillis()),
periodNoOrigin.truncate(new DateTime("2012-01-02T07:00:04.123Z").getMillis()),
periodNoOrigin.truncate(new DateTime("2012-01-04T00:20:04.123Z").getMillis())
)
);
}
@Test
public void testCompoundPeriodTruncate() throws Exception
{
final DateTime origin = new DateTime("2012-01-02T05:00:00.000-08:00");
QueryGranularity periodOrigin = new PeriodGranularity(new Period("P1M2D"),
origin,
DateTimeZone.forID("America/Los_Angeles"));
assertSame(
Lists.newArrayList(
new DateTime("2011-11-30T05:00:00.000-08:00"),
new DateTime("2012-01-02T05:00:00.000-08:00"),
new DateTime("2012-02-04T05:00:00.000-08:00"),
new DateTime("2012-02-04T05:00:00.000-08:00")
),
Lists.newArrayList(
periodOrigin.truncate(new DateTime("2012-01-01T05:00:04.123-08:00").getMillis()),
periodOrigin.truncate(new DateTime("2012-01-02T07:00:04.123-08:00").getMillis()),
periodOrigin.truncate(new DateTime("2012-03-01T07:20:04.123-08:00").getMillis()),
periodOrigin.truncate(new DateTime("2012-02-04T05:00:00.000-08:00").getMillis())
)
);
QueryGranularity periodNoOrigin = new PeriodGranularity(new Period("P1M2D"),
null,
DateTimeZone.forID("America/Los_Angeles"));
assertSame(
Lists.newArrayList(
new DateTime("1970-01-01T00:00:00.000-08:00"),
new DateTime("2011-12-12T00:00:00.000-08:00"),
new DateTime("2012-01-14T00:00:00.000-08:00"),
new DateTime("2012-02-16T00:00:00.000-08:00")
),
Lists.newArrayList(
periodNoOrigin.truncate(new DateTime("1970-01-01T05:02:04.123-08:00").getMillis()),
periodNoOrigin.truncate(new DateTime("2012-01-01T05:02:04.123-08:00").getMillis()),
periodNoOrigin.truncate(new DateTime("2012-01-15T07:01:04.123-08:00").getMillis()),
periodNoOrigin.truncate(new DateTime("2012-02-16T00:00:00.000-08:00").getMillis())
)
);
}
@Test
public void testCompoundPeriodMillisTruncate() throws Exception
{
final DateTime origin = new DateTime("2012-01-02T05:00:00.000-08:00");
QueryGranularity periodOrigin = new PeriodGranularity(new Period("PT12H5M"),
origin,
DateTimeZone.forID("America/Los_Angeles"));
assertSame(
Lists.newArrayList(
new DateTime("2012-01-01T04:50:00.000-08:00"),
new DateTime("2012-01-02T05:00:00.000-08:00"),
new DateTime("2012-01-02T17:05:00.000-08:00"),
new DateTime("2012-02-03T22:25:00.000-08:00")
),
Lists.newArrayList(
periodOrigin.truncate(new DateTime("2012-01-01T05:00:04.123-08:00").getMillis()),
periodOrigin.truncate(new DateTime("2012-01-02T07:00:04.123-08:00").getMillis()),
periodOrigin.truncate(new DateTime("2012-01-03T00:20:04.123-08:00").getMillis()),
periodOrigin.truncate(new DateTime("2012-02-03T22:25:00.000-08:00").getMillis())
)
);
}
@Test
public void testIterableAllSimple() throws Exception
{
final DateTime baseTime = new DateTime("2011-01-01T00:00:00.000Z");
assertSame(
Lists.newArrayList(baseTime),
QueryGranularity.ALL.iterable(baseTime.getMillis(), baseTime.plus(Days.days(3)).getMillis())
);
}
@Test
public void testIterableAllComplex() throws Exception
{
final DateTime baseTime = new DateTime("2011-01-01T09:38:02.992Z");
assertSame(
Lists.newArrayList(baseTime),
QueryGranularity.ALL.iterable(baseTime.getMillis(), baseTime.plus(Days.days(3)).getMillis())
);
}
@Test
public void testSerializePeriod() throws Exception
{
ObjectMapper mapper = new DefaultObjectMapper();
String json = "{ \"type\": \"period\", \"period\": \"P1D\" }";
QueryGranularity gran = mapper.readValue(json, QueryGranularity.class);
Assert.assertEquals(new PeriodGranularity(new Period("P1D"), null, null), gran);
json = "{ \"type\": \"period\", \"period\": \"P1D\","
+ "\"timeZone\": \"America/Los_Angeles\", \"origin\": \"1970-01-01T00:00:00Z\"}";
gran = mapper.readValue(json, QueryGranularity.class);
Assert.assertEquals(new PeriodGranularity(new Period("P1D"), new DateTime(0l), DateTimeZone.forID("America/Los_Angeles")), gran);
QueryGranularity expected = new PeriodGranularity(
new Period("P1D"),
new DateTime("2012-01-01"),
DateTimeZone.forID("America/Los_Angeles")
);
String jsonOut = mapper.writeValueAsString(expected);
Assert.assertEquals(expected, mapper.readValue(jsonOut, QueryGranularity.class));
}
@Test
public void testSerializeDuration() throws Exception
{
ObjectMapper mapper = new DefaultObjectMapper();
String json = "{ \"type\": \"duration\", \"duration\": \"3600000\" }";
QueryGranularity gran = mapper.readValue(json, QueryGranularity.class);
Assert.assertEquals(new DurationGranularity(3600000, null), gran);
json = "{ \"type\": \"duration\", \"duration\": \"5\", \"origin\": \"2012-09-01T00:00:00.002Z\" }";
gran = mapper.readValue(json, QueryGranularity.class);
Assert.assertEquals(new DurationGranularity(5, 2), gran);
DurationGranularity expected = new DurationGranularity(5, 2);
Assert.assertEquals(expected, mapper.readValue(mapper.writeValueAsString(expected), QueryGranularity.class));
}
@Test
public void testSerializeSimple() throws Exception
{
ObjectMapper mapper = new DefaultObjectMapper();
Assert.assertEquals(
QueryGranularity.ALL,
mapper.readValue(
mapper.writeValueAsString(QueryGranularity.ALL),
QueryGranularity.class
)
);
Assert.assertEquals(
QueryGranularity.NONE,
mapper.readValue(
mapper.writeValueAsString(QueryGranularity.NONE),
QueryGranularity.class
)
);
}
@Test
public void testDeserializeSimple() throws Exception
{
ObjectMapper mapper = new DefaultObjectMapper();
Assert.assertEquals(QueryGranularity.ALL, mapper.readValue("\"all\"", QueryGranularity.class));
Assert.assertEquals(QueryGranularity.ALL, mapper.readValue("\"ALL\"", QueryGranularity.class));
Assert.assertEquals(QueryGranularity.NONE, mapper.readValue("\"none\"", QueryGranularity.class));
Assert.assertEquals(QueryGranularity.NONE, mapper.readValue("\"NONE\"", QueryGranularity.class));
Assert.assertEquals(QueryGranularity.DAY, mapper.readValue("\"day\"", QueryGranularity.class));
Assert.assertEquals(QueryGranularity.HOUR, mapper.readValue("\"hour\"", QueryGranularity.class));
Assert.assertEquals(QueryGranularity.MINUTE, mapper.readValue("\"minute\"", QueryGranularity.class));
QueryGranularity gran = mapper.readValue("\"thirty_minute\"", QueryGranularity.class);
Assert.assertEquals(new DurationGranularity(30 * 60 * 1000, null), gran);
gran = mapper.readValue("\"fifteen_minute\"", QueryGranularity.class);
Assert.assertEquals(new DurationGranularity(15 * 60 * 1000, null), gran);
}
private void assertSame(List<DateTime> expected, Iterable<Long> actual)
{
Assert.assertEquals(expected.size(), Iterables.size(actual));
Iterator<Long> actualIter = actual.iterator();
Iterator<DateTime> expectedIter = expected.iterator();
while (actualIter.hasNext() && expectedIter.hasNext()) {
long a = actualIter.next().longValue();
Assert.assertEquals(expectedIter.next().getMillis(), a);
}
Assert.assertFalse("actualIter not exhausted!?", actualIter.hasNext());
Assert.assertFalse("expectedIter not exhausted!?", expectedIter.hasNext());
}
}