You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by am...@apache.org on 2013/05/29 13:12:16 UTC
svn commit: r1487438 - in /hive/branches/HIVE-4115/ql/src:
java/org/apache/hadoop/hive/ql/cube/metadata/
java/org/apache/hadoop/hive/ql/cube/parse/
test/org/apache/hadoop/hive/ql/cube/parse/
Author: amareshwari
Date: Wed May 29 11:12:15 2013
New Revision: 1487438
URL: http://svn.apache.org/r1487438
Log:
Queries with starting of the month as start period should be considered for MONTHLY update period
Modified:
hive/branches/HIVE-4115/ql/src/java/org/apache/hadoop/hive/ql/cube/metadata/CubeFactTable.java
hive/branches/HIVE-4115/ql/src/java/org/apache/hadoop/hive/ql/cube/parse/DateUtil.java
hive/branches/HIVE-4115/ql/src/test/org/apache/hadoop/hive/ql/cube/parse/TestDateUtil.java
hive/branches/HIVE-4115/ql/src/test/org/apache/hadoop/hive/ql/cube/parse/TestMaxUpdateInterval.java
Modified: hive/branches/HIVE-4115/ql/src/java/org/apache/hadoop/hive/ql/cube/metadata/CubeFactTable.java
URL: http://svn.apache.org/viewvc/hive/branches/HIVE-4115/ql/src/java/org/apache/hadoop/hive/ql/cube/metadata/CubeFactTable.java?rev=1487438&r1=1487437&r2=1487438&view=diff
==============================================================================
--- hive/branches/HIVE-4115/ql/src/java/org/apache/hadoop/hive/ql/cube/metadata/CubeFactTable.java (original)
+++ hive/branches/HIVE-4115/ql/src/java/org/apache/hadoop/hive/ql/cube/metadata/CubeFactTable.java Wed May 29 11:12:15 2013
@@ -167,6 +167,9 @@ public final class CubeFactTable extends
case MONTHLY:
intervals = DateUtil.getMonthsBetween(from, to);
break;
+ case WEEKLY:
+ intervals = DateUtil.getWeeksBetween(from, to);
+ break;
}
if (intervals > 0) {
@@ -175,7 +178,7 @@ public final class CubeFactTable extends
}
}
} else {
- // Below MONTHLY, we can use weight to find out the correct period
+ // Below WEEKLY, we can use weight to find out the correct period
if (diff < i.weight()) {
// interval larger than time diff
continue;
Modified: hive/branches/HIVE-4115/ql/src/java/org/apache/hadoop/hive/ql/cube/parse/DateUtil.java
URL: http://svn.apache.org/viewvc/hive/branches/HIVE-4115/ql/src/java/org/apache/hadoop/hive/ql/cube/parse/DateUtil.java?rev=1487438&r1=1487437&r2=1487438&view=diff
==============================================================================
--- hive/branches/HIVE-4115/ql/src/java/org/apache/hadoop/hive/ql/cube/parse/DateUtil.java (original)
+++ hive/branches/HIVE-4115/ql/src/java/org/apache/hadoop/hive/ql/cube/parse/DateUtil.java Wed May 29 11:12:15 2013
@@ -236,13 +236,18 @@ public class DateUtil {
}
public static int getMonthsBetween(Date from, Date to) {
- from = DateUtils.round(from, Calendar.MONTH);
- to = DateUtils.truncate(to, Calendar.MONTH);
+ // Move 'from' to end of month, unless its the first day of month
+ if (!from.equals(DateUtils.truncate(from, Calendar.MONTH))) {
+ from = DateUtils.addMonths(DateUtils.truncate(from, Calendar.MONTH), 1);
+ }
- int months = 0;
- from = DateUtils.addMonths(from, 1);
+ // Move 'to' to beginning of month, unless its the last day of the month
+ if (!to.equals(DateUtils.round(to, Calendar.MONTH))) {
+ to = DateUtils.truncate(to, Calendar.MONTH);
+ }
- while (to.after(from)) {
+ int months = 0;
+ while (from.before(to)) {
from = DateUtils.addMonths(from, 1);
months++;
}
@@ -250,45 +255,102 @@ public class DateUtil {
}
public static int getQuartersBetween(Date from, Date to) {
+ int months = getMonthsBetween(from, to);
+ if (months < 3) {
+ return 0;
+ }
Calendar cal = Calendar.getInstance();
cal.setTime(from);
- int fromQtr = cal.get(Calendar.MONTH) / 3 + 1;
+ int fromMonth = cal.get(Calendar.MONTH);
int fromYear = cal.get(Calendar.YEAR);
- cal.setTime(to);
- int toQtr = cal.get(Calendar.MONTH) / 3 + 1;
- int toYear = cal.get(Calendar.YEAR);
-
- if (fromYear == toYear) {
- if (fromQtr == toQtr) {
- return 0;
- } else {
- return toQtr - fromQtr - 1;
- }
+ // Get the start date of the quarter
+ int qtrStartMonth;
+ if (fromMonth % 3 == 0) {
+ qtrStartMonth = fromMonth;
} else {
- from = DateUtils.round(from, Calendar.YEAR);
- to = DateUtils.truncate(to, Calendar.YEAR);
- int quarters = 0;
- from = DateUtils.addYears(from, 1);
- while (to.after(from)) {
- from = DateUtils.addYears(from, 1);
- quarters += 4;
- }
- return quarters + (4 - fromQtr) + (toQtr - 1);
+ qtrStartMonth = fromMonth - (fromMonth % 3);
+ }
+
+ cal.clear();
+ cal.set(Calendar.MONTH, qtrStartMonth);
+ cal.set(Calendar.YEAR, fromYear);
+ cal.set(Calendar.DAY_OF_MONTH, 1);
+ Date fromQtrStartDate = cal.getTime();
+
+ int moveUp = 0;
+ if (fromQtrStartDate.before(from)) {
+ moveUp = 3 - (fromMonth % 3);
}
+
+ if (months % 3 != 0) {
+ months = months - (months % 3);
+ }
+ return (months - moveUp) / 3;
}
public static int getYearsBetween(Date from, Date to) {
- from = DateUtils.round(from, Calendar.YEAR);
- to = DateUtils.truncate(to, Calendar.YEAR);
- int years = 0;
- from = DateUtils.addYears(from, 1);
-
- while (to.after(from)) {
- from = DateUtils.addYears(from, 1);
- years++;
+ int months = getMonthsBetween(from, to);
+ if (months < 12) {
+ return 0;
+ }
+
+ // Get start of year for 'from' date
+ Calendar cal = Calendar.getInstance();
+ cal.setTime(from);
+ int fromMonth = cal.get(Calendar.MONTH);
+ int fromYear = cal.get(Calendar.YEAR);
+
+ cal.clear();
+ cal.set(Calendar.MONTH, Calendar.JANUARY);
+ cal.set(Calendar.YEAR, fromYear);
+ cal.set(Calendar.DAY_OF_MONTH, 1);
+
+ Date yearStartDate = cal.getTime();
+
+ int moveUp = 0;
+ if (yearStartDate.before(from)) {
+ moveUp = 12 - (fromMonth % 12);
}
- return years;
+
+ if (months % 12 != 0) {
+ months = months - (months % 12);
+ }
+
+ return (months - moveUp)/ 12;
+ }
+
+ public static int getWeeksBetween(Date from, Date to) {
+ int dayDiff = 0;
+ Date tmpFrom = from;
+ while (tmpFrom.before(to)) {
+ tmpFrom = DateUtils.addDays(tmpFrom, 1);
+ dayDiff++;
+ }
+
+ if (dayDiff < 7) {
+ return 0;
+ }
+
+ Calendar cal = Calendar.getInstance();
+ cal.setTime(from);
+ int fromWeek = cal.get(Calendar.WEEK_OF_YEAR);
+ int fromDay = cal.get(Calendar.DAY_OF_WEEK);
+ int fromYear = cal.get(Calendar.YEAR);
+
+ cal.clear();
+ cal.set(Calendar.YEAR, fromYear);
+ cal.set(Calendar.WEEK_OF_YEAR, fromWeek);
+ cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
+ int maxDayInWeek = cal.getActualMaximum(Calendar.DAY_OF_WEEK);
+ Date fromWeekStartDate = cal.getTime();
+
+ if (fromWeekStartDate.before(from)) {
+ // Count from the start of next week
+ dayDiff -= (maxDayInWeek - (fromDay - Calendar.SUNDAY));
+ }
+
+ return dayDiff / 7;
}
}
Modified: hive/branches/HIVE-4115/ql/src/test/org/apache/hadoop/hive/ql/cube/parse/TestDateUtil.java
URL: http://svn.apache.org/viewvc/hive/branches/HIVE-4115/ql/src/test/org/apache/hadoop/hive/ql/cube/parse/TestDateUtil.java?rev=1487438&r1=1487437&r2=1487438&view=diff
==============================================================================
--- hive/branches/HIVE-4115/ql/src/test/org/apache/hadoop/hive/ql/cube/parse/TestDateUtil.java (original)
+++ hive/branches/HIVE-4115/ql/src/test/org/apache/hadoop/hive/ql/cube/parse/TestDateUtil.java Wed May 29 11:12:15 2013
@@ -2,10 +2,13 @@ package org.apache.hadoop.hive.ql.cube.p
import java.text.ParseException;
import java.text.SimpleDateFormat;
+import java.util.Calendar;
import java.util.Date;
import junit.framework.Assert;
+import org.apache.commons.lang.time.DateUtils;
+import org.junit.Before;
import org.junit.Test;
/**
@@ -20,14 +23,17 @@ public class TestDateUtil {
"2013-Jan-01", "2013-Dec-31",
"2013-Feb-01", "2013-Apr-25",
"2012-Feb-01", "2013-Feb-01",
- "2011-Feb-01", "2013-Feb-01"
+ "2011-Feb-01", "2013-Feb-01",
+ "2013-Jan-02", "2013-Feb-02",
+ "2013-Jan-02", "2013-Mar-02",
};
public static final SimpleDateFormat DATE_FMT = new SimpleDateFormat("yyyy-MMM-dd");
- private final Date pairs[];
+ private Date pairs[];
- public TestDateUtil() {
+ @Before
+ public void setUp() {
pairs = new Date[testpairs.length];
for (int i = 0; i < testpairs.length; i++) {
try {
@@ -41,65 +47,120 @@ public class TestDateUtil {
@Test
public void testMonthsBetween() throws Exception {
int i = 0;
- Assert.assertEquals(0, DateUtil.getMonthsBetween(pairs[i], pairs[i+1]));
+ Assert.assertEquals("2013-Jan-01 to 2013-Jan-31",
+ 1, DateUtil.getMonthsBetween(pairs[i],
+ DateUtils.round(pairs[i+1], Calendar.MONTH)));
i+=2;
- Assert.assertEquals(3, DateUtil.getMonthsBetween(pairs[i], pairs[i+1]));
+ Assert.assertEquals("2013-Jan-01 to 2013-May-31",
+ 5, DateUtil.getMonthsBetween(pairs[i],
+ DateUtils.round(pairs[i+1], Calendar.MONTH)));
i+=2;
- Assert.assertEquals(10, DateUtil.getMonthsBetween(pairs[i], pairs[i+1]));
+ Assert.assertEquals("2013-Jan-01 to 2013-Dec-31",
+ 12,
+ DateUtil.getMonthsBetween(pairs[i], DateUtils.round(pairs[i+1], Calendar.MONTH)));
i+=2;
- Assert.assertEquals(1, DateUtil.getMonthsBetween(pairs[i], pairs[i+1]));
+ Assert.assertEquals("2013-Feb-01 to 2013-Apr-25",
+ 2, DateUtil.getMonthsBetween(pairs[i], pairs[i+1]));
i+=2;
- Assert.assertEquals(11, DateUtil.getMonthsBetween(pairs[i], pairs[i+1]));
+ Assert.assertEquals("2012-Feb-01 to 2013-Feb-01",
+ 12, DateUtil.getMonthsBetween(pairs[i], pairs[i+1]));
i+=2;
- Assert.assertEquals(23, DateUtil.getMonthsBetween(pairs[i], pairs[i+1]));
+ Assert.assertEquals("2011-Feb-01 to 2013-Feb-01",
+ 24, DateUtil.getMonthsBetween(pairs[i], pairs[i+1]));
+
+ i+=2;
+ Assert.assertEquals("2013-Jan-02 to 2013-Feb-02",
+ 0,
+ DateUtil.getMonthsBetween(pairs[i], pairs[i+1]));
+
+ i+=2;
+ Assert.assertEquals( "2013-Jan-02 to 2013-Mar-02",
+ 1, DateUtil.getMonthsBetween(pairs[i], pairs[i+1]));
}
@Test
public void testQuartersBetween() throws Exception {
int i = 0;
- Assert.assertEquals(0, DateUtil.getQuartersBetween(pairs[i], pairs[i+1]));
+ Assert.assertEquals("2013-Jan-01 to 2013-Jan-31",
+ 0, DateUtil.getQuartersBetween(pairs[i], pairs[i+1]));
i+=2;
- Assert.assertEquals(0, DateUtil.getQuartersBetween(pairs[i], pairs[i+1]));
+ Assert.assertEquals("2013-Jan-01 to 2013-May-31",
+ 1, DateUtil.getQuartersBetween(pairs[i], pairs[i+1]));
i+=2;
- Assert.assertEquals(2, DateUtil.getQuartersBetween(pairs[i], pairs[i+1]));
+ Assert.assertEquals("2013-Jan-01 to 2013-Dec-31",
+ 4, DateUtil.getQuartersBetween(pairs[i], DateUtils.round(pairs[i+1], Calendar.MONTH)));
i+=2;
- Assert.assertEquals(0, DateUtil.getQuartersBetween(pairs[i], pairs[i+1]));
+ Assert.assertEquals("2013-Feb-01 to 2013-Apr-25",
+ 0, DateUtil.getQuartersBetween(pairs[i], pairs[i+1]));
i+=2;
- Assert.assertEquals(3, DateUtil.getQuartersBetween(pairs[i], pairs[i+1]));
+ Assert.assertEquals("2012-Feb-01 to 2013-Feb-01",
+ 3, DateUtil.getQuartersBetween(pairs[i], pairs[i+1]));
i+=2;
- Assert.assertEquals(7, DateUtil.getQuartersBetween(pairs[i], pairs[i+1]));
+ Assert.assertEquals("2011-Feb-01 to 2013-Feb-01",
+ 7, DateUtil.getQuartersBetween(pairs[i], pairs[i+1]));
}
@Test
public void testYearsBetween() throws Exception {
int i = 0;
- Assert.assertEquals(0, DateUtil.getYearsBetween(pairs[i], pairs[i+1]));
+ Assert.assertEquals( "" + pairs[i] + "->" + pairs[i+1],
+ 0, DateUtil.getYearsBetween(pairs[i], pairs[i+1]));
i+=2;
- Assert.assertEquals(0, DateUtil.getYearsBetween(pairs[i], pairs[i+1]));
+ Assert.assertEquals( "" + pairs[i] + "->" + pairs[i+1],
+ 0, DateUtil.getYearsBetween(pairs[i], pairs[i+1]));
i+=2;
- Assert.assertEquals(0, DateUtil.getYearsBetween(pairs[i], pairs[i+1]));
+ Assert.assertEquals( "" + pairs[i] + "->" + pairs[i+1],
+ 1, DateUtil.getYearsBetween(pairs[i],
+ DateUtils.round(pairs[i+1], Calendar.MONTH)));
i+=2;
- Assert.assertEquals(0, DateUtil.getYearsBetween(pairs[i], pairs[i+1]));
+ Assert.assertEquals( "" + pairs[i] + "->" + pairs[i+1],
+ 0, DateUtil.getYearsBetween(pairs[i], pairs[i+1]));
i+=2;
- Assert.assertEquals(0, DateUtil.getYearsBetween(pairs[i], pairs[i+1]));
+ Assert.assertEquals( "" + pairs[i] + "->" + pairs[i+1],
+ 0, DateUtil.getYearsBetween(pairs[i], pairs[i+1]));
i+=2;
- Assert.assertEquals(1, DateUtil.getYearsBetween(pairs[i], pairs[i+1]));
+ Assert.assertEquals( "" + pairs[i] + "->" + pairs[i+1],
+ 1, DateUtil.getYearsBetween(pairs[i], pairs[i+1]));
+ }
+
+ @Test
+ public void testWeeksBetween() throws Exception {
+ int weeks = DateUtil.getWeeksBetween(DATE_FMT.parse("2013-May-26"),
+ DATE_FMT.parse("2013-Jun-2"));
+ Assert.assertEquals("2013-May-26 to 2013-Jun-2", 1, weeks);
+
+ weeks = DateUtil.getWeeksBetween(DATE_FMT.parse("2013-May-27"),
+ DATE_FMT.parse("2013-Jun-1"));
+ Assert.assertEquals("2013-May-27 to 2013-Jun-1", 0, weeks);
+
+ weeks = DateUtil.getWeeksBetween(DATE_FMT.parse("2013-May-25"),
+ DATE_FMT.parse("2013-Jun-2"));
+ Assert.assertEquals("2013-May-25 to 2013-Jun-1", 1, weeks);
+
+ weeks = DateUtil.getWeeksBetween(DATE_FMT.parse("2013-May-26"),
+ DATE_FMT.parse("2013-Jun-9"));
+ Assert.assertEquals("2013-May-26 to 2013-Jun-8", 2, weeks);
+
+
+ weeks = DateUtil.getWeeksBetween(DATE_FMT.parse("2013-May-26"),
+ DATE_FMT.parse("2013-Jun-10"));
+ Assert.assertEquals("2013-May-26 to 2013-Jun-10", 2, weeks);
}
}
Modified: hive/branches/HIVE-4115/ql/src/test/org/apache/hadoop/hive/ql/cube/parse/TestMaxUpdateInterval.java
URL: http://svn.apache.org/viewvc/hive/branches/HIVE-4115/ql/src/test/org/apache/hadoop/hive/ql/cube/parse/TestMaxUpdateInterval.java?rev=1487438&r1=1487437&r2=1487438&view=diff
==============================================================================
--- hive/branches/HIVE-4115/ql/src/test/org/apache/hadoop/hive/ql/cube/parse/TestMaxUpdateInterval.java (original)
+++ hive/branches/HIVE-4115/ql/src/test/org/apache/hadoop/hive/ql/cube/parse/TestMaxUpdateInterval.java Wed May 29 11:12:15 2013
@@ -15,7 +15,7 @@ import org.junit.Test;
/*
* Unit test for maxUpdateIntervalIn method in CubeFactTable
*/
-public class TestMaxUpdateInterval<periods> {
+public class TestMaxUpdateInterval {
public static final String[] testpairs = {
"2013-Jan-01", "2013-Jan-31",
"2013-Jan-01", "2013-May-31",
@@ -23,7 +23,8 @@ public class TestMaxUpdateInterval<perio
"2013-Feb-01", "2013-Apr-25",
"2012-Feb-01", "2013-Feb-01",
"2011-Feb-01", "2013-Feb-01",
- "2013-Feb-01", "2013-Feb-21"
+ "2013-Feb-01", "2013-Feb-21",
+ "2013-Feb-01", "2013-Feb-4"
};
public static final SimpleDateFormat DATE_FMT = new SimpleDateFormat(
@@ -49,31 +50,43 @@ public class TestMaxUpdateInterval<perio
allPeriods.addAll(Arrays.asList(UpdatePeriod.values()));
int i = 0;
- Assert.assertEquals(UpdatePeriod.DAILY, CubeFactTable.maxIntervalInRange(
+ Assert.assertEquals("2013-Jan-01 to 2013-Jan-31",
+ UpdatePeriod.WEEKLY, CubeFactTable.maxIntervalInRange(
pairs[i], pairs[i+1], allPeriods));
i+=2;
- Assert.assertEquals(UpdatePeriod.MONTHLY, CubeFactTable.maxIntervalInRange(
+ Assert.assertEquals("2013-Jan-01 to 2013-May-31",
+ UpdatePeriod.QUARTERLY, CubeFactTable.maxIntervalInRange(
pairs[i], pairs[i+1], allPeriods));
i+=2;
- Assert.assertEquals(UpdatePeriod.QUARTERLY, CubeFactTable.
+ Assert.assertEquals("2013-Jan-01 to 2013-Dec-31",
+ UpdatePeriod.QUARTERLY, CubeFactTable.
maxIntervalInRange(pairs[i], pairs[i+1], allPeriods));
i+=2;
- Assert.assertEquals(UpdatePeriod.MONTHLY, CubeFactTable.maxIntervalInRange(
+ Assert.assertEquals("2013-Feb-01 to 2013-Apr-25",
+ UpdatePeriod.MONTHLY, CubeFactTable.maxIntervalInRange(
pairs[i], pairs[i+1], allPeriods));
i+=2;
- Assert.assertEquals(UpdatePeriod.QUARTERLY, CubeFactTable.
+ Assert.assertEquals("2012-Feb-01 to 2013-Feb-01",
+ UpdatePeriod.QUARTERLY, CubeFactTable.
maxIntervalInRange(pairs[i], pairs[i+1], allPeriods));
i+=2;
- Assert.assertEquals(UpdatePeriod.YEARLY, CubeFactTable.maxIntervalInRange(
+ Assert.assertEquals("2011-Feb-01 to 2013-Feb-01",
+ UpdatePeriod.YEARLY, CubeFactTable.maxIntervalInRange(
pairs[i], pairs[i+1], allPeriods));
i+=2;
- Assert.assertEquals(UpdatePeriod.WEEKLY, CubeFactTable.maxIntervalInRange(
+ Assert.assertEquals("2013-Feb-01 to 2013-Feb-21",
+ UpdatePeriod.WEEKLY, CubeFactTable.maxIntervalInRange(
+ pairs[i], pairs[i+1], allPeriods));
+
+ i+=2;
+ Assert.assertEquals("2013-Feb-01 to 2013-Feb-4",
+ UpdatePeriod.DAILY, CubeFactTable.maxIntervalInRange(
pairs[i], pairs[i+1], allPeriods));
}