diff --git a/dotCMS/src/main/java/com/dotcms/analytics/query/AnalyticsQueryParser.java b/dotCMS/src/main/java/com/dotcms/analytics/query/AnalyticsQueryParser.java index 688c8080b96c..fe2915f91d3c 100644 --- a/dotCMS/src/main/java/com/dotcms/analytics/query/AnalyticsQueryParser.java +++ b/dotCMS/src/main/java/com/dotcms/analytics/query/AnalyticsQueryParser.java @@ -121,8 +121,8 @@ public CubeJSQuery parseQueryToCubeQuery(final AnalyticsQuery query) { private Collection parseTimeDimensions(final String timeDimensions) { final TimeDimensionParser.TimeDimension parsedTimeDimension = TimeDimensionParser.parseTimeDimension(timeDimensions); return Stream.of( - new CubeJSQuery.TimeDimension(parsedTimeDimension.getTerm(), - parsedTimeDimension.getField()) + new CubeJSQuery.TimeDimension(parsedTimeDimension.getDimension(), + parsedTimeDimension.getGranularity()) ).collect(Collectors.toList()); } diff --git a/dotCMS/src/main/java/com/dotcms/analytics/query/TimeDimensionParser.java b/dotCMS/src/main/java/com/dotcms/analytics/query/TimeDimensionParser.java index 92db4faa9651..3c068e353792 100644 --- a/dotCMS/src/main/java/com/dotcms/analytics/query/TimeDimensionParser.java +++ b/dotCMS/src/main/java/com/dotcms/analytics/query/TimeDimensionParser.java @@ -20,42 +20,60 @@ private TimeDimensionParser() { // singleton } - private static final String FIELD_REGEX = "(\\w+\\.\\w+)\\s+(\\w+)"; + private static final String FIELD_REGEX = "^(\\w+\\.\\w+)\\s+(\\w+)(?:\\s+(.+))?$"; + private static final Pattern PATTERN = Pattern.compile(FIELD_REGEX); public static class TimeDimension { - private String term; - private String field; - public TimeDimension(final String term, final String field) { - this.term = term; - this.field = field; + private final String dimension; + private final String granularity; + private final String dateRange; + + public TimeDimension(final String dimension, final String granularity) { + this.dimension = dimension; + this.granularity = granularity; + this.dateRange = null; + } + + public TimeDimension(final String dimension, final String granularity, final String dateRange) { + this.dimension = dimension; + this.granularity = granularity; + this.dateRange = dateRange; + } + + public String getDimension() { + return dimension; } - public String getTerm() { - return term; + public String getGranularity() { + return granularity; } - public String getField() { - return field; + public String getDateRange() { + return dateRange; } @Override public String toString() { - return "Term: " + term + ", Field: " + field; + return "TimeDimension{" + + "dimension='" + dimension + '\'' + + ", granularity='" + granularity + '\'' + + ", dateRange='" + dateRange + '\'' + + '}'; } } public static TimeDimension parseTimeDimension(final String expression) throws IllegalArgumentException { // cache and checked - final Pattern pattern = Pattern.compile(FIELD_REGEX); - final Matcher matcher = pattern.matcher(expression.trim()); + final Matcher matcher = PATTERN.matcher(expression.trim()); if (matcher.matches()) { - final String term = matcher.group(1); // Ex: Events.day - final String field = matcher.group(2); // Ex: day + final String dimension = matcher.group(1); // Ex: Events.day + final String granularity = matcher.group(2); // Ex: day + final String dateRange = matcher.group(3); // Ex: date range - return new TimeDimension(term, field); + return new TimeDimension(dimension, granularity, dateRange); } else { throw new IllegalArgumentException("The expression is not valid. This should be the format 'Term Field'."); } diff --git a/dotCMS/src/main/java/com/dotcms/cube/CubeJSQuery.java b/dotCMS/src/main/java/com/dotcms/cube/CubeJSQuery.java index d63209147fa7..85eeaa861da0 100644 --- a/dotCMS/src/main/java/com/dotcms/cube/CubeJSQuery.java +++ b/dotCMS/src/main/java/com/dotcms/cube/CubeJSQuery.java @@ -381,12 +381,21 @@ public Builder timeDimensions(Collection timeDimensions) { public static class TimeDimension { String dimension; String granularity; + String dateRange; public TimeDimension(String dimension, String granularity) { this.dimension = dimension; this.granularity = granularity; } + public TimeDimension(final String dimension, + final String granularity, + final String dateRange) { + this.dimension = dimension; + this.granularity = granularity; + this.dateRange = dateRange; + } + public String getDimension() { return dimension; } @@ -394,6 +403,10 @@ public String getDimension() { public String getGranularity() { return granularity; } + + public String getDateRange() { + return dateRange; + } } public static class OrderItem { diff --git a/dotCMS/src/test/java/com/dotcms/analytics/query/TimeDimensionParserTest.java b/dotCMS/src/test/java/com/dotcms/analytics/query/TimeDimensionParserTest.java new file mode 100644 index 000000000000..13a23dcec789 --- /dev/null +++ b/dotCMS/src/test/java/com/dotcms/analytics/query/TimeDimensionParserTest.java @@ -0,0 +1,43 @@ +package com.dotcms.analytics.query; + +import org.junit.Assert; +import org.junit.Test; + +/** + * Test for {@link TimeDimensionParser} + * @author jsanca + */ +public class TimeDimensionParserTest { + + /** + * Parse a simple query with only dimension and granularity + * Events.day day + * should return Events.day and day + */ + @Test + public void test_parseTimeDimension_dimension_plus_granularity_should_be_OK() throws Exception { + final TimeDimensionParser.TimeDimension result = + TimeDimensionParser.parseTimeDimension("Events.day day"); + + Assert.assertNotNull(result); + Assert.assertEquals("Events.day", result.getDimension()); + Assert.assertEquals("day", result.getGranularity()); + Assert.assertNull(result.getDateRange()); + } + + /** + * Parse a simple query with only dimension and granularity + * Events.day day + * should return Events.day and day + */ + @Test + public void test_parseTimeDimension_dimension_plus_granularity_and_dateRange_should_be_OK() throws Exception { + final TimeDimensionParser.TimeDimension result = + TimeDimensionParser.parseTimeDimension("Events.day day This Week"); + + Assert.assertNotNull(result); + Assert.assertEquals("Events.day", result.getDimension()); + Assert.assertEquals("day", result.getGranularity()); + Assert.assertEquals("This Week", result.getDateRange()); + } +}