package com.linkedin.thirdeye.client.pinot; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.mockito.Mockito; import org.testng.Assert; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import com.google.common.cache.LoadingCache; import com.linkedin.thirdeye.api.TimeGranularity; import com.linkedin.thirdeye.api.TimeSpec; import com.linkedin.thirdeye.client.ThirdEyeCacheRegistry; import com.linkedin.thirdeye.datalayer.dto.DatasetConfigDTO; public class PqlUtilsTest { @Test(dataProvider = "betweenClauseArgs") public void getBetweenClause(DateTime start, DateTime end, TimeSpec timeFieldSpec, String expected) throws ExecutionException { String collection = "collection"; DatasetConfigDTO datasetConfig = new DatasetConfigDTO(); LoadingCache<String, DatasetConfigDTO> mockDatasetConfigCache = Mockito.mock(LoadingCache.class); Mockito.when(mockDatasetConfigCache.get(collection)).thenReturn(datasetConfig); ThirdEyeCacheRegistry.getInstance().registerDatasetConfigCache(mockDatasetConfigCache); String betweenClause = PqlUtils.getBetweenClause(start, end, timeFieldSpec, "collection"); Assert.assertEquals(betweenClause, expected); } @DataProvider(name = "betweenClauseArgs") public Object[][] betweenClauseArgs() { return new Object[][] { // equal start+end, no format getBetweenClauseTestArgs("2016-01-01T00:00:00.000+00:00", "2016-01-01T00:00:00.000+00:00", "timeColumn", 2, TimeUnit.HOURS, null, " timeColumn = 201612"), // "" with date range getBetweenClauseTestArgs("2016-01-01T00:00:00.000+00:00", "2016-01-02T00:00:00.000+00:00", "timeColumn", 2, TimeUnit.HOURS, null, " timeColumn >= 201612 AND timeColumn < 201624"), // equal start+end, with format getBetweenClauseTestArgs("2016-01-01T08:00:00.000+00:00", "2016-01-01T08:00:00.000+00:00", "timeColumn", 1, TimeUnit.DAYS, "yyyyMMdd", " timeColumn = 20160101"), // "" with date range getBetweenClauseTestArgs("2016-01-01T08:00:00.000+00:00", "2016-01-02T08:00:00.000+00:00", "timeColumn", 1, TimeUnit.DAYS, "yyyyMMdd", " timeColumn >= 20160101 AND timeColumn < 20160102"), // Incorrectly aligned date ranges, no format getBetweenClauseTestArgs("2016-01-01T01:00:00.000+00:00", "2016-01-01T23:00:00.000+00:00", "timeColumn", 2, TimeUnit.HOURS, null, " timeColumn >= 201613 AND timeColumn < 201623"), // Incorrectly aligned date ranges, with format getBetweenClauseTestArgs("2016-01-01T01:00:00.000+00:00", "2016-01-01T23:00:00.000+00:00", "timeColumn", 2, TimeUnit.HOURS, "yyyyMMddHH", " timeColumn >= 2016010101 AND timeColumn < 2016010123") }; } private Object[] getBetweenClauseTestArgs(String startISO, String endISO, String timeColumn, int timeGranularitySize, TimeUnit timeGranularityUnit, String timeSpecFormat, String expected) { return new Object[] { new DateTime(startISO, DateTimeZone.UTC), new DateTime(endISO, DateTimeZone.UTC), new TimeSpec(timeColumn, new TimeGranularity(timeGranularitySize, timeGranularityUnit), timeSpecFormat), expected }; } }