http://git-wip-us.apache.org/repos/asf/lens/blob/5de45e0f/lens-cube/src/main/java/org/apache/lens/cube/metadata/FactTable.java ---------------------------------------------------------------------- diff --git a/lens-cube/src/main/java/org/apache/lens/cube/metadata/FactTable.java b/lens-cube/src/main/java/org/apache/lens/cube/metadata/FactTable.java new file mode 100644 index 0000000..f87cf44 --- /dev/null +++ b/lens-cube/src/main/java/org/apache/lens/cube/metadata/FactTable.java @@ -0,0 +1,166 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 + * <p> + * http://www.apache.org/licenses/LICENSE-2.0 + * <p> + * 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.apache.lens.cube.metadata; + +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.apache.hadoop.hive.metastore.api.FieldSchema; + +/** + * The Fact table interface + */ +public interface FactTable extends Named { + + /** + * Get map of storage to update period mapping + * + * @return Map of storage to set of update periods + */ + public Map<String, Set<UpdatePeriod>> getUpdatePeriods(); + + /** + * Cube to which this fact belongs to + * + * @return the cube string + */ + public String getCubeName(); + + /** + * The set of Storage names + * + * @return set of strings + */ + public Set<String> getStorages(); + + /** + *The type of the fact + * + * @return table type {@link CubeTableType} + */ + public CubeTableType getTableType(); + + /** + * Config properties + * + * @return map of string, string + */ + public Map<String, String> getProperties(); + + /** + * Valid columns of the fact + * + * @return list of column names + */ + public Set<String> getValidColumns(); + + /** + * Weight of the fact + * + * @return weight of the fact in double + */ + public double weight(); + + /** + * Set of all the columns names of the fact + * + * @return set of column names + */ + public Set<String> getAllFieldNames(); + + /** + *tag for checking data completeness + * + * @return Tag String + */ + public String getDataCompletenessTag(); + + /** + * List of columns of the fact + * + * @return set of {@link FieldSchema} + */ + public List<FieldSchema> getColumns(); + + /** + * Is Aggregated Fact + * + * @return true if fact is Aggregated , false otherwise + */ + public boolean isAggregated(); + + /** + * Absolute start time of the fact + * + * @return Absolute Start time of the fact {@link Date} + */ + public Date getAbsoluteStartTime(); + + /** + * Relative start time of the fact + * + * @return Relative Start time of the fact {@link Date} + */ + public Date getRelativeStartTime(); + + /** + * Start time of the fact + * + * @return Start time of the fact {@link Date} + */ + public Date getStartTime(); + + /** + * Absolute end time of the fact + * + * @return Absolute End time of the fact {@link Date} + */ + public Date getAbsoluteEndTime(); + + /** + * Relative End time of the Fact + * + * @return Relative end time of the fact {@link Date} + */ + public Date getRelativeEndTime(); + + /** + * End time of the fact + * + * @return End time of the fact {@link Date} + */ + public Date getEndTime(); + + /** + * Is Virtual Fact + * + * @return true if fact is a virtual fact, false otherwise + */ + public boolean isVirtualFact(); + + /** + * Storage name of the fact + * + * @return Storage name of the fact + */ + public String getSourceFactName(); + +}
http://git-wip-us.apache.org/repos/asf/lens/blob/5de45e0f/lens-cube/src/main/java/org/apache/lens/cube/metadata/JAXBUtils.java ---------------------------------------------------------------------- diff --git a/lens-cube/src/main/java/org/apache/lens/cube/metadata/JAXBUtils.java b/lens-cube/src/main/java/org/apache/lens/cube/metadata/JAXBUtils.java index e1e3d16..7dfb166 100644 --- a/lens-cube/src/main/java/org/apache/lens/cube/metadata/JAXBUtils.java +++ b/lens-cube/src/main/java/org/apache/lens/cube/metadata/JAXBUtils.java @@ -718,6 +718,15 @@ public final class JAXBUtils { mapFromXProperties(fact.getProperties()), storageTablePrefixMap); } + public static CubeVirtualFactTable cubeVirtualFactFromFactTable(XVirtualFactTable fact, FactTable sourceFactTable) + throws LensException { + + Optional<Double> optionalWeight = Optional.fromNullable(fact.getWeight()); + + return new CubeVirtualFactTable(fact.getCubeName(), fact.getName(), + optionalWeight, mapFromXProperties(fact.getProperties()), sourceFactTable); + } + public static Segmentation segmentationFromXSegmentation(XSegmentation seg) throws LensException { Map<String, String> props = new HashMap<>(); @@ -736,7 +745,7 @@ public final class JAXBUtils { } - public static XFactTable factTableFromCubeFactTable(CubeFactTable cFact) { + public static XFactTable factTableFromCubeFactTable(FactTable cFact) { XFactTable fact = XCF.createXFactTable(); fact.setName(cFact.getName()); fact.setColumns(new XColumns()); @@ -749,6 +758,19 @@ public final class JAXBUtils { return fact; } + public static XVirtualFactTable virtualFactTableFromVirtualCubeFactTable(CubeVirtualFactTable vFact) { + XVirtualFactTable fact = XCF.createXVirtualFactTable(); + fact.setName(vFact.getName()); + fact.setProperties(new XProperties()); + + fact.getProperties().getProperty().addAll(xPropertiesFromMap(vFact.getProperties())); + + fact.setWeight(vFact.weight()); + fact.setSourceFactName(vFact.getSourceCubeFactTable().getName()); + fact.setCubeName(vFact.getCubeName()); + return fact; + } + public static XSegmentation xsegmentationFromSegmentation(Segmentation cSeg) { XSegmentation seg = XCF.createXSegmentation(); seg.setName(cSeg.getName()); http://git-wip-us.apache.org/repos/asf/lens/blob/5de45e0f/lens-cube/src/main/java/org/apache/lens/cube/metadata/MetastoreConstants.java ---------------------------------------------------------------------- diff --git a/lens-cube/src/main/java/org/apache/lens/cube/metadata/MetastoreConstants.java b/lens-cube/src/main/java/org/apache/lens/cube/metadata/MetastoreConstants.java index 88500fd..945fe26 100644 --- a/lens-cube/src/main/java/org/apache/lens/cube/metadata/MetastoreConstants.java +++ b/lens-cube/src/main/java/org/apache/lens/cube/metadata/MetastoreConstants.java @@ -49,6 +49,7 @@ public final class MetastoreConstants { public static final String FACT_KEY_PFX = "cube.fact."; public static final String UPDATE_PERIOD_SFX = ".updateperiods"; public static final String CUBE_NAME_SFX = ".cubename"; + public static final String SOURCE_NAME_SFX = ".source"; public static final String VALID_COLUMNS_SFX = ".valid.columns"; public static final String FACT_AGGREGATED_PROPERTY = "cube.fact.is.aggregated"; public static final String FACT_ABSOLUTE_START_TIME = "cube.fact.absolute.start.time"; @@ -58,6 +59,7 @@ public final class MetastoreConstants { public static final String FACT_COL_START_TIME_PFX = "cube.fact.col.start.time."; public static final String FACT_COL_END_TIME_PFX = "cube.fact.col.end.time."; public static final String FACT_DATA_COMPLETENESS_TAG = "cube.fact.datacompleteness.tag"; + public static final String VIRTUAL_FACT_FILTER = "cube.fact.query.where.filter"; // Segmentation constants public static final String SEGMENTATION_KEY_PFX = "cube.segmentation.internal."; http://git-wip-us.apache.org/repos/asf/lens/blob/5de45e0f/lens-cube/src/main/java/org/apache/lens/cube/metadata/MetastoreUtil.java ---------------------------------------------------------------------- diff --git a/lens-cube/src/main/java/org/apache/lens/cube/metadata/MetastoreUtil.java b/lens-cube/src/main/java/org/apache/lens/cube/metadata/MetastoreUtil.java index 40f766b..fbc37ac 100644 --- a/lens-cube/src/main/java/org/apache/lens/cube/metadata/MetastoreUtil.java +++ b/lens-cube/src/main/java/org/apache/lens/cube/metadata/MetastoreUtil.java @@ -49,6 +49,9 @@ import org.antlr.runtime.CommonToken; import com.google.common.collect.Sets; +import lombok.extern.slf4j.Slf4j; + +@Slf4j public class MetastoreUtil { private MetastoreUtil() { @@ -345,7 +348,7 @@ public class MetastoreUtil { } // ////////////////////////// - // Fact propertes /// + // Fact properties /// // ///////////////////////// public static String getFactStorageListKey(String name) { return getFactKeyPrefix(name) + STORAGE_LIST_SFX; @@ -363,6 +366,10 @@ public class MetastoreUtil { return getFactKeyPrefix(name) + CUBE_NAME_SFX; } + public static String getSourceFactNameKey(String name) { + return getFactKeyPrefix(name) + SOURCE_NAME_SFX; + } + public static String getValidColumnsKey(String name) { return getFactKeyPrefix(name) + VALID_COLUMNS_SFX; } @@ -398,6 +405,23 @@ public class MetastoreUtil { // ////////////////////////// // Utils /// // ///////////////////////// + + public static Date getDateFromProperty(String prop, boolean relative, boolean start) { + try { + if (StringUtils.isNotBlank(prop)) { + if (relative) { + return DateUtil.resolveRelativeDate(prop, new Date()); + } else { + return DateUtil.resolveAbsoluteDate(prop); + } + } + } catch (LensException e) { + log.error("unable to parse {} {} date: {}", relative ? "relative" : "absolute", start ? "start" : "end", prop); + } + return start ? DateUtil.MIN_DATE : DateUtil.MAX_DATE; + } + + public static <E extends Named> String getNamedStr(Collection<E> set) { if (set == null) { return ""; http://git-wip-us.apache.org/repos/asf/lens/blob/5de45e0f/lens-cube/src/main/java/org/apache/lens/cube/metadata/Segmentation.java ---------------------------------------------------------------------- diff --git a/lens-cube/src/main/java/org/apache/lens/cube/metadata/Segmentation.java b/lens-cube/src/main/java/org/apache/lens/cube/metadata/Segmentation.java index 1e3cef3..54059d1 100644 --- a/lens-cube/src/main/java/org/apache/lens/cube/metadata/Segmentation.java +++ b/lens-cube/src/main/java/org/apache/lens/cube/metadata/Segmentation.java @@ -160,11 +160,13 @@ public class Segmentation extends AbstractCubeTable { public Date getAbsoluteStartTime() { - return getDateFromProperty(MetastoreConstants.SEGMENTATION_ABSOLUTE_START_TIME, false, true); + return MetastoreUtil.getDateFromProperty(this.getProperties() + .get(MetastoreConstants.SEGMENTATION_ABSOLUTE_START_TIME), false, true); } public Date getRelativeStartTime() { - return getDateFromProperty(MetastoreConstants.SEGMENTATION_RELATIVE_START_TIME, true, true); + return MetastoreUtil.getDateFromProperty(this.getProperties() + .get(MetastoreConstants.SEGMENTATION_RELATIVE_START_TIME), true, true); } public Date getStartTime() { @@ -172,16 +174,19 @@ public class Segmentation extends AbstractCubeTable { } public Date getAbsoluteEndTime() { - return getDateFromProperty(MetastoreConstants.SEGMENTATION_ABSOLUTE_END_TIME, false, false); + return MetastoreUtil.getDateFromProperty(this.getProperties() + .get(MetastoreConstants.SEGMENTATION_ABSOLUTE_END_TIME), false, false); } public Date getRelativeEndTime() { - return getDateFromProperty(MetastoreConstants.SEGMENTATION_RELATIVE_END_TIME, true, false); + return MetastoreUtil.getDateFromProperty(this.getProperties() + .get(MetastoreConstants.SEGMENTATION_RELATIVE_END_TIME), true, false); } public Date getEndTime() { return Collections.min(Lists.newArrayList(getRelativeEndTime(), getAbsoluteEndTime())); } + static String getCubeName(String segName, Map<String, String> props) { return props.get(MetastoreUtil.getSegmentationCubeNameKey(segName)); } http://git-wip-us.apache.org/repos/asf/lens/blob/5de45e0f/lens-cube/src/main/java/org/apache/lens/cube/parse/Candidate.java ---------------------------------------------------------------------- diff --git a/lens-cube/src/main/java/org/apache/lens/cube/parse/Candidate.java b/lens-cube/src/main/java/org/apache/lens/cube/parse/Candidate.java index 9f07336..2edeb41 100644 --- a/lens-cube/src/main/java/org/apache/lens/cube/parse/Candidate.java +++ b/lens-cube/src/main/java/org/apache/lens/cube/parse/Candidate.java @@ -18,13 +18,7 @@ */ package org.apache.lens.cube.parse; -import java.util.Collection; -import java.util.Collections; -import java.util.Date; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Set; +import java.util.*; import org.apache.lens.cube.metadata.CubeInterface; import org.apache.lens.cube.metadata.CubeMetastoreClient; http://git-wip-us.apache.org/repos/asf/lens/blob/5de45e0f/lens-cube/src/main/java/org/apache/lens/cube/parse/CandidateTableResolver.java ---------------------------------------------------------------------- diff --git a/lens-cube/src/main/java/org/apache/lens/cube/parse/CandidateTableResolver.java b/lens-cube/src/main/java/org/apache/lens/cube/parse/CandidateTableResolver.java index a8d6fbd..93736cd 100644 --- a/lens-cube/src/main/java/org/apache/lens/cube/parse/CandidateTableResolver.java +++ b/lens-cube/src/main/java/org/apache/lens/cube/parse/CandidateTableResolver.java @@ -84,12 +84,12 @@ class CandidateTableResolver implements ContextRewriter { private void populateCandidateTables(CubeQueryContext cubeql) throws LensException { if (cubeql.getCube() != null) { - List<CubeFactTable> factTables = cubeql.getMetastoreClient().getAllFacts(cubeql.getCube()); + List<FactTable> factTables = cubeql.getMetastoreClient().getAllFacts(cubeql.getCube()); if (factTables.isEmpty()) { throw new LensException(LensCubeErrorCode.NO_CANDIDATE_FACT_AVAILABLE.getLensErrorInfo(), cubeql.getCube().getName() + " does not have any facts"); } - for (CubeFactTable fact : factTables) { + for (FactTable fact : factTables) { if (fact.getUpdatePeriods().isEmpty()) { log.info("Not considering fact: {} as it has no update periods", fact.getName()); } else { @@ -99,6 +99,7 @@ class CandidateTableResolver implements ContextRewriter { } } } + log.info("Populated storage candidates: {}", cubeql.getCandidates()); List<SegmentationCandidate> segmentationCandidates = Lists.newArrayList(); for (Segmentation segmentation : cubeql.getMetastoreClient().getAllSegmentations(cubeql.getCube())) { @@ -211,7 +212,8 @@ class CandidateTableResolver implements ContextRewriter { if (key.contains(MetastoreConstants.FACT_COL_START_TIME_PFX)) { String propCol = StringUtils.substringAfter(key, MetastoreConstants.FACT_COL_START_TIME_PFX); if (factCol.equals(propCol)) { - startTime = ((StorageCandidate) table).getFact().getDateFromProperty(key, false, true); + startTime = MetastoreUtil.getDateFromProperty(((StorageCandidate) table).getFact().getProperties().get(key), + false, true); } } } @@ -226,7 +228,8 @@ class CandidateTableResolver implements ContextRewriter { if (key.contains(MetastoreConstants.FACT_COL_END_TIME_PFX)) { String propCol = StringUtils.substringAfter(key, MetastoreConstants.FACT_COL_END_TIME_PFX); if (factCol.equals(propCol)) { - endTime = ((StorageCandidate) table).getFact().getDateFromProperty(key, false, true); + endTime = MetastoreUtil.getDateFromProperty(((StorageCandidate) table).getFact().getProperties().get(key), + false, true); } } } http://git-wip-us.apache.org/repos/asf/lens/blob/5de45e0f/lens-cube/src/main/java/org/apache/lens/cube/parse/StorageCandidate.java ---------------------------------------------------------------------- diff --git a/lens-cube/src/main/java/org/apache/lens/cube/parse/StorageCandidate.java b/lens-cube/src/main/java/org/apache/lens/cube/parse/StorageCandidate.java index 1e54f13..99c6cf6 100644 --- a/lens-cube/src/main/java/org/apache/lens/cube/parse/StorageCandidate.java +++ b/lens-cube/src/main/java/org/apache/lens/cube/parse/StorageCandidate.java @@ -46,16 +46,7 @@ import java.util.TimeZone; import java.util.TreeSet; import java.util.stream.Stream; -import org.apache.lens.cube.metadata.AbstractCubeTable; -import org.apache.lens.cube.metadata.CubeFactTable; -import org.apache.lens.cube.metadata.CubeInterface; -import org.apache.lens.cube.metadata.DateUtil; -import org.apache.lens.cube.metadata.Dimension; -import org.apache.lens.cube.metadata.FactPartition; -import org.apache.lens.cube.metadata.MetastoreConstants; -import org.apache.lens.cube.metadata.MetastoreUtil; -import org.apache.lens.cube.metadata.TimeRange; -import org.apache.lens.cube.metadata.UpdatePeriod; +import org.apache.lens.cube.metadata.*; import org.apache.lens.server.api.error.LensException; import org.apache.lens.server.api.metastore.DataCompletenessChecker; @@ -126,7 +117,7 @@ public class StorageCandidate implements Candidate, CandidateTable { * Participating fact, storage and dimensions for this StorageCandidate */ @Getter - private CubeFactTable fact; + private FactTable fact; @Getter private String storageName; @Getter @@ -180,7 +171,7 @@ public class StorageCandidate implements Candidate, CandidateTable { this.answerableMeasurePhraseIndices = sc.answerableMeasurePhraseIndices; } - public StorageCandidate(CubeInterface cube, CubeFactTable fact, String storageName, CubeQueryContext cubeQueryContext) + public StorageCandidate(CubeInterface cube, FactTable fact, String storageName, CubeQueryContext cubeQueryContext) throws LensException { this.cube = cube; this.fact = fact; @@ -189,7 +180,7 @@ public class StorageCandidate implements Candidate, CandidateTable { throw new IllegalArgumentException("Cube,fact and storageName should be non null"); } this.storageName = storageName; - this.storageTable = MetastoreUtil.getFactOrDimtableStorageTableName(fact.getName(), storageName); + this.storageTable = MetastoreUtil.getFactOrDimtableStorageTableName(fact.getSourceFactName(), storageName); this.name = getFact().getName(); this.processTimePartCol = getConf().get(CubeQueryConfUtil.PROCESS_TIME_PART_COL); String formatStr = getConf().get(CubeQueryConfUtil.PART_WHERE_CLAUSE_DATE_FORMAT); @@ -199,7 +190,8 @@ public class StorageCandidate implements Candidate, CandidateTable { completenessPartCol = getConf().get(CubeQueryConfUtil.COMPLETENESS_CHECK_PART_COL); completenessThreshold = getConf() .getFloat(CubeQueryConfUtil.COMPLETENESS_THRESHOLD, CubeQueryConfUtil.DEFAULT_COMPLETENESS_THRESHOLD); - Set<String> storageTblNames = getCubeMetastoreClient().getStorageTables(fact.getName(), storageName); + + Set<String> storageTblNames = getCubeMetastoreClient().getStorageTables(fact, storageName); isStorageTblsAtUpdatePeriodLevel = storageTblNames.size() > 1 || !storageTblNames.iterator().next().equalsIgnoreCase(storageTable); setStorageStartAndEndDate(); @@ -259,8 +251,8 @@ public class StorageCandidate implements Candidate, CandidateTable { List<Date> startDates = new ArrayList<>(); List<Date> endDates = new ArrayList<>(); for (String storageTablePrefix : getValidStorageTableNames()) { - startDates.add(getCubeMetastoreClient().getStorageTableStartDate(storageTablePrefix, fact.getName())); - endDates.add(getCubeMetastoreClient().getStorageTableEndDate(storageTablePrefix, fact.getName())); + startDates.add(getCubeMetastoreClient().getStorageTableStartDate(storageTablePrefix, fact.getSourceFactName())); + endDates.add(getCubeMetastoreClient().getStorageTableEndDate(storageTablePrefix, fact.getSourceFactName())); } this.startTime = Collections.min(startDates); this.endTime = Collections.max(endDates); @@ -278,7 +270,7 @@ public class StorageCandidate implements Candidate, CandidateTable { return uniqueStorageTables; } else { //Get all storage tables. - return getCubeMetastoreClient().getStorageTables(fact.getName(), storageName); + return getCubeMetastoreClient().getStorageTables(fact, storageName); } } @@ -302,11 +294,6 @@ public class StorageCandidate implements Candidate, CandidateTable { } @Override - public AbstractCubeTable getTable() { - return fact; - } - - @Override public AbstractCubeTable getBaseTable() { return (AbstractCubeTable) cube; } @@ -320,14 +307,17 @@ public class StorageCandidate implements Candidate, CandidateTable { return phrase.isEvaluable(this); } - @Override + public AbstractCubeTable getTable() { + return (AbstractCubeTable) fact; + } + public Optional<Date> getColumnStartTime(String column) { Date startTime = null; for (String key : getTable().getProperties().keySet()) { if (key.contains(MetastoreConstants.FACT_COL_START_TIME_PFX)) { String propCol = StringUtils.substringAfter(key, MetastoreConstants.FACT_COL_START_TIME_PFX); if (column.equals(propCol)) { - startTime = getTable().getDateFromProperty(key, false, true); + startTime = MetastoreUtil.getDateFromProperty(getTable().getProperties().get(key), false, true); } } } @@ -341,7 +331,7 @@ public class StorageCandidate implements Candidate, CandidateTable { if (key.contains(MetastoreConstants.FACT_COL_END_TIME_PFX)) { String propCol = StringUtils.substringAfter(key, MetastoreConstants.FACT_COL_END_TIME_PFX); if (column.equals(propCol)) { - endTime = getTable().getDateFromProperty(key, false, true); + endTime = MetastoreUtil.getDateFromProperty(getTable().getProperties().get(key), false, true); } } } @@ -436,7 +426,7 @@ public class StorageCandidate implements Candidate, CandidateTable { return true; } - if (!getCubeMetastoreClient().partColExists(this.getFact().getName(), storageName, partCol)) { + if (!getCubeMetastoreClient().partColExists(this.getFact(), storageName, partCol)) { log.info("{} does not exist in {}", partCol, name); return false; } @@ -587,7 +577,6 @@ public class StorageCandidate implements Candidate, CandidateTable { Set<FactPartition> rangeParts = getPartitions(timeRange, validUpdatePeriods, true, failOnPartialData, missingParts); String partCol = timeRange.getPartitionColumn(); boolean partColNotSupported = rangeParts.isEmpty(); - String storageTableName = getStorageTable(); if (storagePruningMsgs.containsKey(this)) { List<CandidateTablePruneCause> causes = storagePruningMsgs.get(this); @@ -604,11 +593,13 @@ public class StorageCandidate implements Candidate, CandidateTable { String sep = ""; while (rangeParts.isEmpty()) { String timeDim = cubeQueryContext.getBaseCube().getTimeDimOfPartitionColumn(partCol); - if (partColNotSupported && !getFact().hasColumn(timeDim)) { - unsupportedTimeDims.add( - cubeQueryContext.getBaseCube().getTimeDimOfPartitionColumn(timeRange.getPartitionColumn()) - ); - break; + if (getFact() instanceof CubeFactTable) { + if (partColNotSupported && !((CubeFactTable) getFact()).hasColumn(timeDim)) { + unsupportedTimeDims.add( + cubeQueryContext.getBaseCube().getTimeDimOfPartitionColumn(timeRange.getPartitionColumn()) + ); + break; + } } TimeRange fallBackRange = getFallbackRange(prevRange, this.getFact().getName(), cubeQueryContext); log.info("No partitions for range:{}. fallback range: {}", timeRange, fallBackRange); http://git-wip-us.apache.org/repos/asf/lens/blob/5de45e0f/lens-cube/src/main/java/org/apache/lens/cube/parse/StorageCandidateHQLContext.java ---------------------------------------------------------------------- diff --git a/lens-cube/src/main/java/org/apache/lens/cube/parse/StorageCandidateHQLContext.java b/lens-cube/src/main/java/org/apache/lens/cube/parse/StorageCandidateHQLContext.java index 730b802..c535196 100644 --- a/lens-cube/src/main/java/org/apache/lens/cube/parse/StorageCandidateHQLContext.java +++ b/lens-cube/src/main/java/org/apache/lens/cube/parse/StorageCandidateHQLContext.java @@ -19,6 +19,8 @@ package org.apache.lens.cube.parse; +import static org.apache.lens.cube.metadata.MetastoreConstants.VIRTUAL_FACT_FILTER; + import java.util.Map; import java.util.Objects; import java.util.Set; @@ -128,7 +130,15 @@ public class StorageCandidateHQLContext extends DimHQLContext { @Override protected void setMissingExpressions() throws LensException { setFrom(getFromTable()); - setWhere(genWhereClauseWithDimPartitions(getWhere())); + String whereString = genWhereClauseWithDimPartitions(getWhere()); + StringBuilder whereStringBuilder = (whereString != null) ? new StringBuilder(whereString) : new StringBuilder(); + + if (this.storageCandidate.getFact().getProperties().get(VIRTUAL_FACT_FILTER) != null) { + appendWhereClause(whereStringBuilder, + this.storageCandidate.getFact().getProperties().get(VIRTUAL_FACT_FILTER), whereString != null); + } + setWhere(whereStringBuilder.length() == 0 ? null : whereStringBuilder.toString()); + if (isRoot()) { if (Objects.equals(getStorageCandidate(), getCubeQueryContext().getPickedCandidate())) { updateAnswerableSelectColumns(); http://git-wip-us.apache.org/repos/asf/lens/blob/5de45e0f/lens-cube/src/main/java/org/apache/lens/cube/parse/StorageTableResolver.java ---------------------------------------------------------------------- diff --git a/lens-cube/src/main/java/org/apache/lens/cube/parse/StorageTableResolver.java b/lens-cube/src/main/java/org/apache/lens/cube/parse/StorageTableResolver.java index 291712b..3acd754 100644 --- a/lens-cube/src/main/java/org/apache/lens/cube/parse/StorageTableResolver.java +++ b/lens-cube/src/main/java/org/apache/lens/cube/parse/StorageTableResolver.java @@ -305,6 +305,7 @@ class StorageTableResolver implements ContextRewriter { if (!skipUpdatePeriodCauses.isEmpty()) { sc.setUpdatePeriodRejectionCause(skipUpdatePeriodCauses); } + // if no update periods were added in previous section, we skip this storage candidate if (!isUpdatePeriodForStorageAdded) { if (skipUpdatePeriodCauses.values().stream().allMatch( @@ -327,12 +328,12 @@ class StorageTableResolver implements ContextRewriter { pruningCauseForThisTimeRange = new CandidateTablePruneCause(CandidateTablePruneCode.TIME_RANGE_NOT_ANSWERABLE); } else if (!sc.getValidUpdatePeriods().contains(UpdatePeriod.CONTINUOUS)) { - if (!client.partColExists(sc.getFact().getName(), sc.getStorageName(), range.getPartitionColumn())) { + if (!client.partColExists(sc.getFact(), sc.getStorageName(), range.getPartitionColumn())) { pruningCauseForThisTimeRange = partitionColumnsMissing(range.getPartitionColumn()); TimeRange fallBackRange = StorageUtil.getFallbackRange(range, sc.getFact().getName(), cubeql); while (fallBackRange != null) { pruningCauseForThisTimeRange = null; - if (!client.partColExists(sc.getFact().getName(), sc.getStorageName(), + if (!client.partColExists(sc.getFact(), sc.getStorageName(), fallBackRange.getPartitionColumn())) { pruningCauseForThisTimeRange = partitionColumnsMissing(fallBackRange.getPartitionColumn()); fallBackRange = StorageUtil.getFallbackRange(fallBackRange, sc.getFact().getName(), cubeql); http://git-wip-us.apache.org/repos/asf/lens/blob/5de45e0f/lens-cube/src/test/java/org/apache/lens/cube/metadata/CubeFactTableTest.java ---------------------------------------------------------------------- diff --git a/lens-cube/src/test/java/org/apache/lens/cube/metadata/CubeFactTableTest.java b/lens-cube/src/test/java/org/apache/lens/cube/metadata/CubeFactTableTest.java index 42e32cb..dd3fae9 100644 --- a/lens-cube/src/test/java/org/apache/lens/cube/metadata/CubeFactTableTest.java +++ b/lens-cube/src/test/java/org/apache/lens/cube/metadata/CubeFactTableTest.java @@ -18,8 +18,6 @@ */ package org.apache.lens.cube.metadata; -import static org.mockito.Matchers.anyBoolean; -import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.testng.Assert.assertEquals; @@ -38,10 +36,10 @@ public class CubeFactTableTest { @DataProvider(name = "properties") public Object[][] factProperties() throws LensException { - String minus1DaysRelative = "now -1 days"; - String minus2DaysRelative = "now -2 days"; - String plus1DaysRelative = "now +1 days"; - String plus2DaysRelative = "now +2 days"; + String minus1DaysRelative = "now.day -1 days"; + String minus2DaysRelative = "now.day -2 days"; + String plus1DaysRelative = "now.day +1 days"; + String plus2DaysRelative = "now.day +2 days"; String minus1DaysAbsolute = DateUtil.relativeToAbsolute(minus1DaysRelative, now); String minus2DaysAbsolute = DateUtil.relativeToAbsolute(minus2DaysRelative, now); @@ -69,8 +67,6 @@ public class CubeFactTableTest { when(cubeFactTable.getProperties()).thenReturn(properties); - when(cubeFactTable.getDateFromProperty(anyString(), anyBoolean(), anyBoolean())).thenCallRealMethod(); - when(cubeFactTable.getRelativeStartTime()).thenCallRealMethod(); when(cubeFactTable.getAbsoluteStartTime()).thenCallRealMethod(); http://git-wip-us.apache.org/repos/asf/lens/blob/5de45e0f/lens-cube/src/test/java/org/apache/lens/cube/metadata/TestCubeMetastoreClient.java ---------------------------------------------------------------------- diff --git a/lens-cube/src/test/java/org/apache/lens/cube/metadata/TestCubeMetastoreClient.java b/lens-cube/src/test/java/org/apache/lens/cube/metadata/TestCubeMetastoreClient.java index a76ef13..6f054c4 100644 --- a/lens-cube/src/test/java/org/apache/lens/cube/metadata/TestCubeMetastoreClient.java +++ b/lens-cube/src/test/java/org/apache/lens/cube/metadata/TestCubeMetastoreClient.java @@ -82,6 +82,7 @@ public class TestCubeMetastoreClient { private static Set<CubeDimAttribute> moreCubeDimensions = Sets.newHashSet(); private static Set<UpdatePeriod> hourlyAndDaily = Sets.newHashSet(HOURLY, DAILY); private static final String CUBE_NAME = "testMetastoreCube"; + private static final String VIRTUAL_CUBE_NAME = "testMetastoreVirtualCube"; private static final String CUBE_NAME_WITH_PROPS = "testMetastoreCubeWithProps"; private static final String DERIVED_CUBE_NAME = "derivedTestMetastoreCube"; private static final String DERIVED_CUBE_NAME_WITH_PROPS = "derivedTestMetastoreCubeWithProps"; @@ -136,6 +137,7 @@ public class TestCubeMetastoreClient { @BeforeClass public static void setup() throws HiveException, AlreadyExistsException, LensException { SessionState.start(conf); + Database database = new Database(); database.setName(TestCubeMetastoreClient.class.getSimpleName()); Hive.get(conf).createDatabase(database); @@ -149,6 +151,7 @@ public class TestCubeMetastoreClient { public static void teardown() throws Exception { // Drop the cube client.dropCube(CUBE_NAME); + client.dropCube(VIRTUAL_CUBE_NAME); client = CubeMetastoreClient.getInstance(conf); assertFalse(client.tableExists(CUBE_NAME)); @@ -1223,6 +1226,93 @@ public class TestCubeMetastoreClient { assertFalse(client.latestPartitionExists(cubeFact.getName(), c1, getDatePartitionKey())); } + @Test(priority = 2) + public void testVirtualCubeFact() throws Exception { + + client.createCube(VIRTUAL_CUBE_NAME, cubeMeasures, cubeDimensions); + String sourceFactName = "testMetastoreFact1"; + List<FieldSchema> factColumns = new ArrayList<>(cubeMeasures.size()); + for (CubeMeasure measure : cubeMeasures) { + factColumns.add(measure.getColumn()); + } + + // add one dimension of the cube + factColumns.add(new FieldSchema("zipcode", "int", "zip")); + + StorageTableDesc s1 = new StorageTableDesc(TextInputFormat.class, HiveIgnoreKeyTextOutputFormat.class, + datePartSingleton, datePartKeySingleton); + + s1.getTblProps().put(MetastoreUtil.getStoragetableStartTimesKey(), "2015, now.day -10 days"); + s1.getTblProps().put(MetastoreUtil.getStoragetableEndTimesKey(), "now.day - 1 day"); + + Map<String, Set<UpdatePeriod>> updatePeriods = getHashMap(c1, Sets.newHashSet(HOURLY, DAILY)); + Map<String, StorageTableDesc> storageTables = getHashMap(c1, s1); + + Map<String, String> sourceFactPropertiesMap = getHashMap("name1", "value1", "name2", "value2"); + CubeFactTable sourceFact = new CubeFactTable(CUBE_NAME, sourceFactName, factColumns, updatePeriods, 10.0, + sourceFactPropertiesMap); + + // create cube fact + client.createCubeFactTable(CUBE_NAME, sourceFactName, factColumns, updatePeriods, 10.0, + sourceFactPropertiesMap, storageTables); + + String virtualFactName = "testMetastoreVirtualFact"; + + Map<String, String> virtualFactPropertiesMap = getHashMap("name1", "newvalue1"); + + CubeVirtualFactTable cubeVirtualFact = new CubeVirtualFactTable(VIRTUAL_CUBE_NAME, virtualFactName, + com.google.common.base.Optional.fromNullable(null), virtualFactPropertiesMap, sourceFact); + + // create virtual cube fact + client.createVirtualFactTable(VIRTUAL_CUBE_NAME, virtualFactName, sourceFactName, null, + virtualFactPropertiesMap); + assertTrue(client.tableExists(virtualFactName)); + Table virtualTbl = client.getHiveTable(virtualFactName); + assertTrue(client.isVirtualFactTable(virtualTbl)); + assertTrue(client.isVirtualFactTableForCube(virtualTbl, VIRTUAL_CUBE_NAME)); + + //get virtual fact + assertTrue(client.getAllFacts(client.getCube(VIRTUAL_CUBE_NAME)).get(0).getName().equals(virtualFactName.trim() + .toLowerCase())); + + CubeVirtualFactTable actualcubeVirtualFact = (CubeVirtualFactTable) (client.getFactTable(virtualFactName)); + assertTrue(cubeVirtualFact.equals(actualcubeVirtualFact)); + + //alter virtual fact + Map<String, String> alterVirtualFactPropertiesMap = getHashMap("name1", "newvalue2", "name3", "value3"); + cubeVirtualFact = new CubeVirtualFactTable(VIRTUAL_CUBE_NAME, virtualFactName, + com.google.common.base.Optional.fromNullable(null), alterVirtualFactPropertiesMap, + sourceFact); + client.alterVirtualCubeFactTable(cubeVirtualFact); + actualcubeVirtualFact = (CubeVirtualFactTable) client.getFactTable(virtualFactName); + assertEquals(actualcubeVirtualFact.getProperties().get("name1"), "newvalue2"); + assertEquals(actualcubeVirtualFact.getProperties().get("name3"), "value3"); + assertTrue(cubeVirtualFact.equals(actualcubeVirtualFact)); + + //alter source fact + FieldSchema newcol = new FieldSchema("newcol", "int", "new col for part"); + sourceFact.alterColumn(newcol); + sourceFact.alterWeight(100); + client.alterCubeFactTable(sourceFact.getName(), sourceFact, storageTables, new HashMap<String, String>()); + actualcubeVirtualFact = (CubeVirtualFactTable) client.getFactTable(virtualFactName); + assertTrue(actualcubeVirtualFact.getColumns().contains(newcol)); + assertEquals(actualcubeVirtualFact.weight(), 100.0); + assertTrue(cubeVirtualFact.equals(actualcubeVirtualFact)); + + //drop source fact + client.dropFact(sourceFactName, true); + + //drop virtual fact + try { + client.dropVirtualFact(virtualFactName); + fail("Expected 404"); + } catch (LensException nfe) { + // PASS since virtual fact is already dropped when source fact was dropped + } + + assertFalse(client.tableExists(virtualFactName)); + } + @Test(priority = 1) public void testSegmentation() throws Exception { String segmentName = "testMetastoreSegmentation"; @@ -1372,7 +1462,7 @@ public class TestCubeMetastoreClient { updatePeriodStoragePrefix.put(DAILY, c4); factTable.addStorage(c4, hourlyAndDaily, updatePeriodStoragePrefix); client.alterCubeFactTable(factName, factTable, storageTables, new HashMap<String, String>()); - CubeFactTable altered2 = client.getCubeFact(factName); + CubeFactTable altered2 = client.getCubeFactTable(factName); assertTrue(client.tableExists(c1TableName)); Table alteredC1Table = client.getTable(c1TableName); assertEquals(alteredC1Table.getInputFormatClass(), SequenceFileInputFormat.class); @@ -1399,7 +1489,7 @@ public class TestCubeMetastoreClient { Map<String, StorageTableDesc> storageTableDescMap = new HashMap<>(); storageTableDescMap.put(c3, s1); client.addStorage(altered2, c3, hourlyAndDaily, storageTableDescMap, updatePeriodStoragePrefix); - CubeFactTable altered3 = client.getCubeFact(factName); + CubeFactTable altered3 = client.getCubeFactTable(factName); assertTrue(altered3.getStorages().contains("C3")); assertTrue(altered3.getUpdatePeriods().get("C3").equals(hourlyAndDaily)); String storageTableName = getFactOrDimtableStorageTableName(factName, c3); @@ -1407,15 +1497,15 @@ public class TestCubeMetastoreClient { client.dropStorageFromFact(factName, c2); storageTableName = getFactOrDimtableStorageTableName(factName, c2); assertFalse(client.tableExists(storageTableName)); - List<CubeFactTable> cubeFacts = client.getAllFacts(client.getCube(CUBE_NAME)); + List<FactTable> cubeFacts = client.getAllFacts(client.getCube(CUBE_NAME)); List<String> cubeFactNames = new ArrayList<>(); - for (CubeFactTable cfact : cubeFacts) { + for (FactTable cfact : cubeFacts) { cubeFactNames.add(cfact.getName()); } assertTrue(cubeFactNames.contains(factName.toLowerCase())); cubeFacts = client.getAllFacts(client.getCube(DERIVED_CUBE_NAME)); cubeFactNames = new ArrayList<>(); - for (CubeFactTable cfact : cubeFacts) { + for (FactTable cfact : cubeFacts) { cubeFactNames.add(cfact.getName()); } assertTrue(cubeFactNames.contains(factName.toLowerCase())); @@ -1425,7 +1515,7 @@ public class TestCubeMetastoreClient { assertFalse(client.tableExists(factName)); cubeFacts = client.getAllFacts(cube); cubeFactNames = new ArrayList<>(); - for (CubeFactTable cfact : cubeFacts) { + for (FactTable cfact : cubeFacts) { cubeFactNames.add(cfact.getName()); } assertFalse(cubeFactNames.contains(factName.toLowerCase())); @@ -1784,6 +1874,7 @@ public class TestCubeMetastoreClient { assertTimeline(endsAndHolesPartitionTimeline, storeAllPartitionTimeline, updatePeriod, getDateWithOffset(HOURLY, firstOffset), getDateWithOffset(HOURLY, latestOffset), holeDates); } + private void assertTimeline(EndsAndHolesPartitionTimeline endsAndHolesPartitionTimeline, StoreAllPartitionTimeline storeAllPartitionTimeline, UpdatePeriod updatePeriod, Date first, Date latest, Date... holes) throws LensException { @@ -2856,8 +2947,8 @@ public class TestCubeMetastoreClient { public void testCaching() throws HiveException, LensException { client = CubeMetastoreClient.getInstance(conf); CubeMetastoreClient client2 = CubeMetastoreClient.getInstance(new HiveConf(TestCubeMetastoreClient.class)); - assertEquals(5, client.getAllCubes().size()); - assertEquals(5, client2.getAllCubes().size()); + assertEquals(6, client.getAllCubes().size()); + assertEquals(6, client2.getAllCubes().size()); defineCube("testcache1", "testcache2", "derived1", "derived2"); client.createCube("testcache1", cubeMeasures, cubeDimensions); @@ -2866,18 +2957,18 @@ public class TestCubeMetastoreClient { client.createDerivedCube("testcache2", "derived2", measures, dimensions, CUBE_PROPERTIES, 0L); assertNotNull(client.getCube("testcache1")); assertNotNull(client2.getCube("testcache1")); - assertEquals(9, client.getAllCubes().size()); - assertEquals(9, client2.getAllCubes().size()); + assertEquals(10, client.getAllCubes().size()); + assertEquals(10, client2.getAllCubes().size()); client2 = CubeMetastoreClient.getInstance(conf); - assertEquals(9, client.getAllCubes().size()); - assertEquals(9, client2.getAllCubes().size()); + assertEquals(10, client.getAllCubes().size()); + assertEquals(10, client2.getAllCubes().size()); conf.setBoolean(MetastoreConstants.METASTORE_ENABLE_CACHING, false); client = CubeMetastoreClient.getInstance(conf); client2 = CubeMetastoreClient.getInstance(conf); - assertEquals(9, client.getAllCubes().size()); - assertEquals(9, client2.getAllCubes().size()); + assertEquals(10, client.getAllCubes().size()); + assertEquals(10, client2.getAllCubes().size()); defineCube("testcache3", "testcache4", "dervied3", "derived4"); client.createCube("testcache3", cubeMeasures, cubeDimensions); client.createCube("testcache4", cubeMeasures, cubeDimensions, CUBE_PROPERTIES); @@ -2885,8 +2976,8 @@ public class TestCubeMetastoreClient { client.createDerivedCube("testcache4", "derived4", measures, dimensions, CUBE_PROPERTIES, 0L); assertNotNull(client.getCube("testcache3")); assertNotNull(client2.getCube("testcache3")); - assertEquals(13, client.getAllCubes().size()); - assertEquals(13, client2.getAllCubes().size()); + assertEquals(14, client.getAllCubes().size()); + assertEquals(14, client2.getAllCubes().size()); conf.setBoolean(MetastoreConstants.METASTORE_ENABLE_CACHING, true); client = CubeMetastoreClient.getInstance(conf); } http://git-wip-us.apache.org/repos/asf/lens/blob/5de45e0f/lens-cube/src/test/java/org/apache/lens/cube/parse/CubeTestSetup.java ---------------------------------------------------------------------- diff --git a/lens-cube/src/test/java/org/apache/lens/cube/parse/CubeTestSetup.java b/lens-cube/src/test/java/org/apache/lens/cube/parse/CubeTestSetup.java index 2f300d3..48869c2 100644 --- a/lens-cube/src/test/java/org/apache/lens/cube/parse/CubeTestSetup.java +++ b/lens-cube/src/test/java/org/apache/lens/cube/parse/CubeTestSetup.java @@ -67,23 +67,7 @@ import javax.xml.bind.JAXBException; import org.apache.lens.api.ToXMLString; import org.apache.lens.api.jaxb.LensJAXBContext; import org.apache.lens.api.metastore.SchemaTraverser; -import org.apache.lens.cube.metadata.CubeDimAttribute; -import org.apache.lens.cube.metadata.CubeDimensionTable; -import org.apache.lens.cube.metadata.CubeFactTable; -import org.apache.lens.cube.metadata.CubeMeasure; -import org.apache.lens.cube.metadata.CubeMetastoreClient; -import org.apache.lens.cube.metadata.CubeTableType; -import org.apache.lens.cube.metadata.DateUtil; -import org.apache.lens.cube.metadata.JAXBUtils; -import org.apache.lens.cube.metadata.MetastoreConstants; -import org.apache.lens.cube.metadata.MetastoreUtil; -import org.apache.lens.cube.metadata.Storage; -import org.apache.lens.cube.metadata.StorageConstants; -import org.apache.lens.cube.metadata.StoragePartitionDesc; -import org.apache.lens.cube.metadata.TestCubeMetastoreClient; -import org.apache.lens.cube.metadata.TimePartition; -import org.apache.lens.cube.metadata.TimePartitionRange; -import org.apache.lens.cube.metadata.UpdatePeriod; +import org.apache.lens.cube.metadata.*; import org.apache.lens.cube.metadata.timeline.EndsAndHolesPartitionTimeline; import org.apache.lens.cube.metadata.timeline.PartitionTimeline; import org.apache.lens.cube.metadata.timeline.StoreAllPartitionTimeline; @@ -140,6 +124,7 @@ public class CubeTestSetup { public static final String TEST_CUBE_NAME = "testCube"; public static final String DERIVED_CUBE_NAME = "derivedCube"; public static final String BASE_CUBE_NAME = "baseCube"; + public static final String VIRTUAL_CUBE_NAME = "virtualCube"; private static String c0 = "C0"; private static String c1 = "C1"; @@ -598,7 +583,7 @@ public class CubeTestSetup { client.clearHiveTableCache(); - CubeFactTable fact = client.getFactTable(factName); + CubeFactTable fact = client.getCubeFactTable(factName); Table table = client.getTable(MetastoreUtil.getStorageTableName(fact.getName(), Storage.getPrefix(c1))); assertEquals(table.getParameters().get(MetastoreUtil.getPartitionTimelineCachePresenceKey()), "true"); for (UpdatePeriod period : Lists.newArrayList(MINUTELY, HOURLY, DAILY, MONTHLY, YEARLY, QUARTERLY)) { @@ -647,7 +632,7 @@ public class CubeTestSetup { private void createCubeCheapFactPartitions(CubeMetastoreClient client) throws HiveException, LensException { String factName = "cheapFact"; - CubeFactTable fact = client.getFactTable(factName); + CubeFactTable fact = client.getCubeFactTable(factName); // Add all hourly partitions for two days Calendar cal = Calendar.getInstance(); cal.setTime(TWODAYS_BACK); @@ -679,7 +664,7 @@ public class CubeTestSetup { private void createTestFact2Partitions(CubeMetastoreClient client) throws Exception { String factName = "testFact2"; - CubeFactTable fact = client.getFactTable(factName); + CubeFactTable fact = client.getCubeFactTable(factName); // Add all hourly partitions for two days Calendar cal = Calendar.getInstance(); cal.setTime(TWODAYS_BACK); @@ -767,7 +752,7 @@ public class CubeTestSetup { private void createTestFact2RawPartitions(CubeMetastoreClient client) throws HiveException, LensException { String factName = "testFact2_raw"; - CubeFactTable fact2 = client.getFactTable(factName); + CubeFactTable fact2 = client.getCubeFactTable(factName); // Add all hourly partitions for two days Calendar cal = Calendar.getInstance(); cal.setTime(TWODAYS_BACK); @@ -850,7 +835,8 @@ public class CubeTestSetup { // bw.write(ToXMLString.toString(JAXBUtils.xCubeFromHiveCube(cubeInterface))); // } // } - for (CubeFactTable cubeFactTable : client.getAllFacts()) { + for (FactTable factTable : client.getAllFacts(false)) { + CubeFactTable cubeFactTable = (CubeFactTable) factTable; try(BufferedWriter bw = new BufferedWriter(new FileWriter(getClass() .getResource("/schema/facts").getPath()+"/"+cubeFactTable.getName()+".xml"))) { bw.write(ToXMLString.toString(client.getXFactTable(cubeFactTable))); @@ -884,26 +870,26 @@ public class CubeTestSetup { private void createSummaryPartitions(CubeMetastoreClient client) throws Exception { String factName = "summary1"; - CubeFactTable fact1 = client.getFactTable(factName); + CubeFactTable fact1 = client.getCubeFactTable(factName); createPIEParts(client, fact1, c2); factName = "summary2"; - CubeFactTable fact2 = client.getFactTable(factName); + CubeFactTable fact2 = client.getCubeFactTable(factName); createPIEParts(client, fact2, c2); factName = "summary3"; - CubeFactTable fact3 = client.getFactTable(factName); + CubeFactTable fact3 = client.getCubeFactTable(factName); createPIEParts(client, fact3, c2); factName = "summary4"; - CubeFactTable fact4 = client.getFactTable(factName); + CubeFactTable fact4 = client.getCubeFactTable(factName); createPIEParts(client, fact4, c2); } private void createBaseCubeFactPartitions(CubeMetastoreClient client) throws HiveException, LensException { String factName = "testFact5_RAW_BASE"; - CubeFactTable fact = client.getFactTable(factName); + CubeFactTable fact = client.getCubeFactTable(factName); // Add all hourly partitions for two days Calendar cal = Calendar.getInstance(); cal.setTime(TWODAYS_BACK); http://git-wip-us.apache.org/repos/asf/lens/blob/5de45e0f/lens-cube/src/test/java/org/apache/lens/cube/parse/TestCubeRewriter.java ---------------------------------------------------------------------- diff --git a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestCubeRewriter.java b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestCubeRewriter.java index 7d1f80d..65ca861 100644 --- a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestCubeRewriter.java +++ b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestCubeRewriter.java @@ -145,6 +145,22 @@ public class TestCubeRewriter extends TestQueryRewrite { // assertNotNull(rewrittenQuery.getNonExistingParts()); } + + @Test + public void testVirtualFactCubeSimpleQuery() throws Exception { + Configuration conf = getConf(); + conf.set(DRIVER_SUPPORTED_STORAGES, "C1"); + CubeQueryContext rewrittenQuery = + rewriteCtx("select SUM(msr2) from virtualCube where " + TWO_DAYS_RANGE, getConfWithStorages("C1")); + String expected = getExpectedQuery(VIRTUAL_CUBE_NAME, "select sum(virtualcube.msr2) as `sum(msr2)` FROM ", + null, "AND ( dim1 = 10 )", getWhereForDailyAndHourly2days(VIRTUAL_CUBE_NAME, + "C1_summary1")); + String hql = rewrittenQuery.toHQL(); + compareQueries(hql, expected); + System.out.println("Non existing parts:" + rewrittenQuery.getNonExistingParts()); + } + + @Test public void testMaxCoveringFact() throws Exception { Configuration conf = getConf(); http://git-wip-us.apache.org/repos/asf/lens/blob/5de45e0f/lens-cube/src/test/java/org/apache/lens/cube/parse/TestCubeSegmentationRewriter.java ---------------------------------------------------------------------- diff --git a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestCubeSegmentationRewriter.java b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestCubeSegmentationRewriter.java index fe52600..9fa31dc 100644 --- a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestCubeSegmentationRewriter.java +++ b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestCubeSegmentationRewriter.java @@ -21,7 +21,6 @@ package org.apache.lens.cube.parse; import static org.apache.lens.cube.metadata.DateFactory.NOW; import static org.apache.lens.cube.metadata.DateFactory.TWO_DAYS_RANGE; -import static org.apache.lens.cube.metadata.DateFactory.TWO_MONTHS_RANGE_UPTO_DAYS; import static org.apache.lens.cube.metadata.DateFactory.getDateWithOffset; import static org.apache.lens.cube.parse.CandidateTablePruneCause.CandidateTablePruneCode.SEGMENTATION_PRUNED; import static org.apache.lens.cube.parse.CubeQueryConfUtil.DISABLE_AGGREGATE_RESOLVER; @@ -38,8 +37,6 @@ import static org.apache.lens.cube.parse.CubeTestSetup.getWhereForHourly2days; import static org.apache.lens.cube.parse.CubeTestSetup.getWhereForUpdatePeriods; import static org.apache.lens.cube.parse.TestCubeRewriter.compareQueries; -import static org.apache.commons.lang3.time.DateUtils.addDays; - import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertTrue; @@ -126,13 +123,13 @@ public class TestCubeSegmentationRewriter extends TestQueryRewrite { */ @Test public void testFactUnionSegmentWithInnerUnion() throws Exception { - CubeQueryContext ctx = rewriteCtx("select cityid, segmsr1 from testcube where " + TWO_MONTHS_RANGE_UPTO_DAYS, - getConf()); + CubeQueryContext ctx = rewriteCtx("select cityid, segmsr1 from testcube where " + + "time_range_in(d_time, 'now.day-40day', 'now.day')", getConf()); String query1, query2, query3, query4; query1 = getExpectedQuery("testcube", "select testcube.cityid as alias0, sum(testcube.segmsr1) as alias1 from ", null, "group by testcube.cityid", getWhereForUpdatePeriods("testcube", "c0_b1fact1", - addDays(getDateWithOffset(UpdatePeriod.MONTHLY, -1), -1), getDateWithOffset(UpdatePeriod.DAILY, -10), + getDateWithOffset(UpdatePeriod.DAILY, -31), getDateWithOffset(UpdatePeriod.DAILY, -10), Sets.newHashSet(UpdatePeriod.MONTHLY, UpdatePeriod.DAILY))); query2 = getExpectedQuery("testcube", "select testcube.cityid as alias0, sum(testcube.segmsr1) as alias1 from ", null, "group by testcube.cityid", @@ -142,13 +139,13 @@ public class TestCubeSegmentationRewriter extends TestQueryRewrite { query3 = getExpectedQuery("testcube", "select testcube.cityid as alias0, sum(testcube.segmsr1) as alias1 from ", null, "group by testcube.cityid", getWhereForUpdatePeriods("testcube", "c0_b2fact1", - addDays(getDateWithOffset(UpdatePeriod.MONTHLY, -1), -1), NOW, + getDateWithOffset(UpdatePeriod.DAILY, -31), NOW, Sets.newHashSet(UpdatePeriod.MONTHLY, UpdatePeriod.DAILY))); query4 = getExpectedQuery("testcube", "select testcube.cityid as alias0, sum(testcube.segmsr1) as alias1 from ", null, "group by testcube.cityid", getWhereForUpdatePeriods("testcube", "c0_b1b2fact1", - addDays(getDateWithOffset(UpdatePeriod.MONTHLY, -2), -1), - addDays(getDateWithOffset(UpdatePeriod.MONTHLY, -1), 0), + getDateWithOffset(UpdatePeriod.DAILY, -41), + getDateWithOffset(UpdatePeriod.DAILY, -30), Sets.newHashSet(UpdatePeriod.MONTHLY, UpdatePeriod.DAILY))); compareUnionQuery(ctx, "select testcube.alias0 as cityid, sum(testcube.alias1) as segmsr1 from (", ") AS testcube GROUP BY (testcube.alias0)", newArrayList(query1, query2, query3, query4)); http://git-wip-us.apache.org/repos/asf/lens/blob/5de45e0f/lens-cube/src/test/java/org/apache/lens/cube/parse/TestUnionQueries.java ---------------------------------------------------------------------- diff --git a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestUnionQueries.java b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestUnionQueries.java index 7ec3324..90c6514 100644 --- a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestUnionQueries.java +++ b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestUnionQueries.java @@ -372,7 +372,7 @@ public class TestUnionQueries extends TestQueryRewrite { FAIL_QUERY_ON_PARTIAL_DATA, false); //If not beginning of month. Expecting this to pass at beginning of every month (example April 01 00:00) - if (!THREE_MONTHS_RANGE_UPTO_DAYS.equals(THREE_MONTHS_RANGE_UPTO_MONTH)) { + if (Calendar.getInstance().get(Calendar.DAY_OF_MONTH) != 1) { NoCandidateFactAvailableException e = getLensExceptionInRewrite("select count(msr4) from testCube where " + THREE_MONTHS_RANGE_UPTO_DAYS, conf); Set<Map.Entry<Candidate, List<CandidateTablePruneCause>>> causes = http://git-wip-us.apache.org/repos/asf/lens/blob/5de45e0f/lens-cube/src/test/resources/schema/cubes/base/virtualcube.xml ---------------------------------------------------------------------- diff --git a/lens-cube/src/test/resources/schema/cubes/base/virtualcube.xml b/lens-cube/src/test/resources/schema/cubes/base/virtualcube.xml new file mode 100644 index 0000000..2a5e0b0 --- /dev/null +++ b/lens-cube/src/test/resources/schema/cubes/base/virtualcube.xml @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<!-- + + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + +--> +<x_base_cube name="virtualcube" xmlns="uri:lens:cube:0.1"> + <properties> + <property name="cube.timedim.partition.d_time" value="dt"/> + <property name="cube.virtualcube.timed.dimensions.list" value="d_time"/> + </properties> + <measures> + <measure _type="FLOAT" default_aggr="SUM" unit="RS" name="msr2" display_string="Measure2" + description="second measure"/> + + </measures> + <dim_attributes> + <dim_attribute _type="string" name="dim1" description="basedim"> + </dim_attribute> + </dim_attributes> +</x_base_cube> http://git-wip-us.apache.org/repos/asf/lens/blob/5de45e0f/lens-cube/src/test/resources/schema/facts/virtualfact.xml ---------------------------------------------------------------------- diff --git a/lens-cube/src/test/resources/schema/facts/virtualfact.xml b/lens-cube/src/test/resources/schema/facts/virtualfact.xml new file mode 100644 index 0000000..860965f --- /dev/null +++ b/lens-cube/src/test/resources/schema/facts/virtualfact.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + +--> +<x_virtual_fact_table source_fact_name="summary1" cube_name="virtualcube" name="virtualfact1" xmlns="uri:lens:cube:0.1" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="uri:lens:cube:0.1 cube-0.1.xsd "> + <properties> + <property name="cube.fact.query.where.filter" value=" dim1 = 10 "/> + </properties> +</x_virtual_fact_table> http://git-wip-us.apache.org/repos/asf/lens/blob/5de45e0f/lens-driver-es/pom.xml ---------------------------------------------------------------------- diff --git a/lens-driver-es/pom.xml b/lens-driver-es/pom.xml index 925020e..7823a62 100644 --- a/lens-driver-es/pom.xml +++ b/lens-driver-es/pom.xml @@ -19,8 +19,7 @@ under the License. --> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.apache.lens</groupId> http://git-wip-us.apache.org/repos/asf/lens/blob/5de45e0f/lens-examples/pom.xml ---------------------------------------------------------------------- diff --git a/lens-examples/pom.xml b/lens-examples/pom.xml index af467ee..abf349f 100644 --- a/lens-examples/pom.xml +++ b/lens-examples/pom.xml @@ -19,8 +19,7 @@ under the License. --> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <name>Lens Examples</name> <parent> http://git-wip-us.apache.org/repos/asf/lens/blob/5de45e0f/lens-examples/src/test/resources/yaml/fact1.yaml ---------------------------------------------------------------------- diff --git a/lens-examples/src/test/resources/yaml/fact1.yaml b/lens-examples/src/test/resources/yaml/fact1.yaml index 9c1c527..1ad539e 100644 --- a/lens-examples/src/test/resources/yaml/fact1.yaml +++ b/lens-examples/src/test/resources/yaml/fact1.yaml @@ -13,6 +13,8 @@ # 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. +name: fact1 +cubeName: sample_cube columns: dim1: type: INT measure2: type: BIGINT @@ -37,6 +39,4 @@ storageTables: external: true tableLocation: /tmp/examples/fact1_local fieldDelimiter: , -name: fact1 -cubeName: sample_cube weight: 100.0 http://git-wip-us.apache.org/repos/asf/lens/blob/5de45e0f/lens-examples/src/test/resources/yaml/fact2.yaml ---------------------------------------------------------------------- diff --git a/lens-examples/src/test/resources/yaml/fact2.yaml b/lens-examples/src/test/resources/yaml/fact2.yaml index 6fadd11..4eed1ae 100644 --- a/lens-examples/src/test/resources/yaml/fact2.yaml +++ b/lens-examples/src/test/resources/yaml/fact2.yaml @@ -13,6 +13,8 @@ # 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. +name: fact2 +cubeName: sample_cube columns: dim1: type: INT dim3: type: INT @@ -32,6 +34,4 @@ storageTables: external: true tableLocation: /tmp/examples/fact2_local fieldDelimiter: , -name: fact2 -cubeName: sample_cube weight: 200.0 http://git-wip-us.apache.org/repos/asf/lens/blob/5de45e0f/lens-examples/src/test/resources/yaml/rawfact.yaml ---------------------------------------------------------------------- diff --git a/lens-examples/src/test/resources/yaml/rawfact.yaml b/lens-examples/src/test/resources/yaml/rawfact.yaml index f7b2d55..4764548 100644 --- a/lens-examples/src/test/resources/yaml/rawfact.yaml +++ b/lens-examples/src/test/resources/yaml/rawfact.yaml @@ -13,6 +13,8 @@ # 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. +name: rawfact +cubeName: sample_cube columns: dim1: type: INT dim2: type: INT @@ -34,6 +36,4 @@ storageTables: external: true tableLocation: /tmp/examples/rawfact fieldDelimiter: , -name: rawfact -cubeName: sample_cube weight: 500.0 http://git-wip-us.apache.org/repos/asf/lens/blob/5de45e0f/lens-examples/src/test/resources/yaml/sales-aggr-continuous-fact.yaml ---------------------------------------------------------------------- diff --git a/lens-examples/src/test/resources/yaml/sales-aggr-continuous-fact.yaml b/lens-examples/src/test/resources/yaml/sales-aggr-continuous-fact.yaml index f95f91b..4fb7165 100644 --- a/lens-examples/src/test/resources/yaml/sales-aggr-continuous-fact.yaml +++ b/lens-examples/src/test/resources/yaml/sales-aggr-continuous-fact.yaml @@ -13,6 +13,8 @@ # 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. +name: sales_aggr_continuous_fact +cubeName: sales columns: order_time: type: TIMESTAMP delivery_time: type: TIMESTAMP @@ -41,6 +43,4 @@ storageTables: tableLocation: /tmp/db-storage.db fieldDelimiter: , storageHandlerName: org.apache.lens.storage.db.DBStorageHandler -name: sales_aggr_continuous_fact -cubeName: sales weight: 50.0 http://git-wip-us.apache.org/repos/asf/lens/blob/5de45e0f/lens-examples/src/test/resources/yaml/sales-aggr-fact1.yaml ---------------------------------------------------------------------- diff --git a/lens-examples/src/test/resources/yaml/sales-aggr-fact1.yaml b/lens-examples/src/test/resources/yaml/sales-aggr-fact1.yaml index 02f65ff..80178f8 100644 --- a/lens-examples/src/test/resources/yaml/sales-aggr-fact1.yaml +++ b/lens-examples/src/test/resources/yaml/sales-aggr-fact1.yaml @@ -13,6 +13,8 @@ # 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. +name: sales_aggr_fact1 +cubeName: sales columns: order_time: type: TIMESTAMP delivery_time: type: TIMESTAMP @@ -57,6 +59,4 @@ storageTables: tableLocation: /tmp/db-storage.db fieldDelimiter: , storageHandlerName: org.apache.lens.storage.db.DBStorageHandler -name: sales_aggr_fact1 -cubeName: sales weight: 300.0 http://git-wip-us.apache.org/repos/asf/lens/blob/5de45e0f/lens-examples/src/test/resources/yaml/sales-aggr-fact2.yaml ---------------------------------------------------------------------- diff --git a/lens-examples/src/test/resources/yaml/sales-aggr-fact2.yaml b/lens-examples/src/test/resources/yaml/sales-aggr-fact2.yaml index ff47d36..ff44dd0 100644 --- a/lens-examples/src/test/resources/yaml/sales-aggr-fact2.yaml +++ b/lens-examples/src/test/resources/yaml/sales-aggr-fact2.yaml @@ -13,6 +13,8 @@ # 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. +name: sales_aggr_fact2 +cubeName: sales columns: order_time: type: TIMESTAMP delivery_time: type: TIMESTAMP @@ -53,6 +55,4 @@ storageTables: tableLocation: /tmp/db-storage.db fieldDelimiter: , storageHandlerName: org.apache.lens.storage.db.DBStorageHandler -name: sales_aggr_fact2 -cubeName: sales weight: 100.0 http://git-wip-us.apache.org/repos/asf/lens/blob/5de45e0f/lens-examples/src/test/resources/yaml/sales-raw-fact.yaml ---------------------------------------------------------------------- diff --git a/lens-examples/src/test/resources/yaml/sales-raw-fact.yaml b/lens-examples/src/test/resources/yaml/sales-raw-fact.yaml index 15becfc..20106b6 100644 --- a/lens-examples/src/test/resources/yaml/sales-raw-fact.yaml +++ b/lens-examples/src/test/resources/yaml/sales-raw-fact.yaml @@ -13,6 +13,8 @@ # 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. +name: sales_raw_fact +cubeName: sales columns: order_time: type: TIMESTAMP delivery_time: type: TIMESTAMP @@ -46,6 +48,4 @@ storageTables: external: true tableLocation: /tmp/examples/rawfact fieldDelimiter: , -name: sales_raw_fact -cubeName: sales weight: 500.0 http://git-wip-us.apache.org/repos/asf/lens/blob/5de45e0f/lens-server-api/src/main/java/org/apache/lens/server/api/metastore/CubeMetastoreService.java ---------------------------------------------------------------------- diff --git a/lens-server-api/src/main/java/org/apache/lens/server/api/metastore/CubeMetastoreService.java b/lens-server-api/src/main/java/org/apache/lens/server/api/metastore/CubeMetastoreService.java index 28b9d22..9d16533 100644 --- a/lens-server-api/src/main/java/org/apache/lens/server/api/metastore/CubeMetastoreService.java +++ b/lens-server-api/src/main/java/org/apache/lens/server/api/metastore/CubeMetastoreService.java @@ -378,10 +378,10 @@ public interface CubeMetastoreService extends LensService, SessionValidator { * * @param sessionid The sessionid * @param fact The fact table name - * @return {@link XFactTable} + * @return {@link XFact} * @throws LensException */ - XFactTable getFactTable(LensSessionHandle sessionid, String fact) throws LensException; + XFact getFactTable(LensSessionHandle sessionid, String fact) throws LensException; /** * Create fact table @@ -390,7 +390,7 @@ public interface CubeMetastoreService extends LensService, SessionValidator { * @param fact The fact table definition * @throws LensException */ - void createFactTable(LensSessionHandle sessionid, XFactTable fact) throws LensException; + void createFactTable(LensSessionHandle sessionid, XFact fact) throws LensException; /** * Update/Alter fact table @@ -399,7 +399,7 @@ public interface CubeMetastoreService extends LensService, SessionValidator { * @param fact The fact table's new definition * @throws LensException */ - void updateFactTable(LensSessionHandle sessionid, XFactTable fact) throws LensException; + void updateFactTable(LensSessionHandle sessionid, XFact fact) throws LensException; /** * Drop fact table. http://git-wip-us.apache.org/repos/asf/lens/blob/5de45e0f/lens-server/pom.xml ---------------------------------------------------------------------- diff --git a/lens-server/pom.xml b/lens-server/pom.xml index 60ed1ae..34a7819 100644 --- a/lens-server/pom.xml +++ b/lens-server/pom.xml @@ -409,4 +409,4 @@ </plugin> </plugins> </build> -</project> \ No newline at end of file +</project> http://git-wip-us.apache.org/repos/asf/lens/blob/5de45e0f/lens-server/src/main/java/org/apache/lens/server/metastore/CubeMetastoreServiceImpl.java ---------------------------------------------------------------------- diff --git a/lens-server/src/main/java/org/apache/lens/server/metastore/CubeMetastoreServiceImpl.java b/lens-server/src/main/java/org/apache/lens/server/metastore/CubeMetastoreServiceImpl.java index 194b380..0a8635c 100644 --- a/lens-server/src/main/java/org/apache/lens/server/metastore/CubeMetastoreServiceImpl.java +++ b/lens-server/src/main/java/org/apache/lens/server/metastore/CubeMetastoreServiceImpl.java @@ -323,7 +323,7 @@ public class CubeMetastoreServiceImpl extends BaseLensService implements CubeMet public void dropAllStoragesOfFact(LensSessionHandle sessionid, String factName) throws LensException { try (SessionContext ignored = new SessionContext(sessionid)){ CubeMetastoreClient msClient = getClient(sessionid); - CubeFactTable tab = msClient.getFactTable(factName); + CubeFactTable tab = msClient.getCubeFactTable(factName); int total = tab.getStorages().size(); int i = 0; List<String> storageNames = new ArrayList<>(tab.getStorages()); @@ -354,7 +354,7 @@ public class CubeMetastoreServiceImpl extends BaseLensService implements CubeMet } @Override - public XFactTable getFactTable(LensSessionHandle sessionid, String fact) throws LensException { + public XFact getFactTable(LensSessionHandle sessionid, String fact) throws LensException { try (SessionContext ignored = new SessionContext(sessionid)){ return getClient(sessionid).getXFactTable(fact); } @@ -371,15 +371,15 @@ public class CubeMetastoreServiceImpl extends BaseLensService implements CubeMet @Override - public void createFactTable(LensSessionHandle sessionid, XFactTable fact) throws LensException { + public void createFactTable(LensSessionHandle sessionid, XFact fact) throws LensException { try (SessionContext ignored = new SessionContext(sessionid)){ - getClient(sessionid).createCubeFactTable(fact); + getClient(sessionid).createFactTable(fact); log.info("Created fact table " + fact.getName()); } } @Override - public void updateFactTable(LensSessionHandle sessionid, XFactTable fact) throws LensException { + public void updateFactTable(LensSessionHandle sessionid, XFact fact) throws LensException { try (SessionContext ignored = new SessionContext(sessionid)){ getClient(sessionid).alterCubeFactTable(fact); log.info("Updated fact table " + fact.getName()); @@ -432,9 +432,9 @@ public class CubeMetastoreServiceImpl extends BaseLensService implements CubeMet if (cubeName != null && fact == null) { throw new LensException("Could not get table: " + cubeName + " as a cube"); } - Collection<CubeFactTable> facts = client.getAllFacts(fact); + Collection<FactTable> facts = client.getAllFacts(fact); List<String> factNames = new ArrayList<>(facts.size()); - for (CubeFactTable cft : facts) { + for (FactTable cft : facts) { factNames.add(cft.getName()); } return factNames; @@ -468,7 +468,7 @@ public class CubeMetastoreServiceImpl extends BaseLensService implements CubeMet throw new NotFoundException("Not a fact table " + fact); } - CubeFactTable cft = msClient.getFactTable(fact); + CubeFactTable cft = msClient.getCubeFactTable(fact); if (cft != null) { return new ArrayList<>(cft.getStorages()); } else { @@ -481,7 +481,7 @@ public class CubeMetastoreServiceImpl extends BaseLensService implements CubeMet throws LensException { try (SessionContext ignored = new SessionContext(sessionid)) { CubeMetastoreClient msClient = getClient(sessionid); - CubeFactTable factTable = msClient.getFactTable(fact); + FactTable factTable = msClient.getFactTable(fact); Set<UpdatePeriod> updatePeriods = factTable.getUpdatePeriods().get(storageName); XStorageTableElement tblElement = JAXBUtils.getXStorageTableFromHiveTable( msClient.getHiveTable(MetastoreUtil.getFactOrDimtableStorageTableName(fact, storageName))); @@ -520,7 +520,7 @@ public class CubeMetastoreServiceImpl extends BaseLensService implements CubeMet CubeMetastoreClient msClient = getClient(sessionid); XStorageTables tables = new XStorageTables(); tables.getStorageTable().add(storageTable); - msClient.addStorage(msClient.getFactTable(fact), storageTable.getStorageName(), updatePeriods, + msClient.addStorage(msClient.getCubeFactTable(fact), storageTable.getStorageName(), updatePeriods, JAXBUtils.tableDescPrefixMapFromXStorageTables(tables), JAXBUtils.storageTablePrefixMapOfStorage(tables).get(storageTable.getStorageName())); log.info("Added storage " + storageTable.getStorageName() + ":" + updatePeriods + " for fact " + fact); @@ -541,7 +541,7 @@ public class CubeMetastoreServiceImpl extends BaseLensService implements CubeMet private CubeFactTable checkFactStorage(LensSessionHandle sessionid, String fact, String storage) throws HiveException, LensException { CubeMetastoreClient client = getClient(sessionid); - CubeFactTable factTable = client.getCubeFact(fact); + CubeFactTable factTable = client.getCubeFactTable(fact); client.verifyStorageExists(factTable, storage); return factTable; } @@ -550,7 +550,7 @@ public class CubeMetastoreServiceImpl extends BaseLensService implements CubeMet throws LensException { Set<String> storageTableNames = new HashSet<>(); if (getClient(sessionHandle).isFactTable(fact)) { - CubeFactTable cft = getClient(sessionHandle).getCubeFact(fact); + CubeFactTable cft = getClient(sessionHandle).getCubeFactTable(fact); Map<UpdatePeriod, String> storageMap = cft.getStoragePrefixUpdatePeriodMap().get(storageName); for (Map.Entry entry : storageMap.entrySet()) { storageTableNames.add(MetastoreUtil.getStorageTableName(fact, Storage.getPrefix((String) entry.getValue()))); http://git-wip-us.apache.org/repos/asf/lens/blob/5de45e0f/lens-server/src/main/java/org/apache/lens/server/metastore/MetastoreResource.java ---------------------------------------------------------------------- diff --git a/lens-server/src/main/java/org/apache/lens/server/metastore/MetastoreResource.java b/lens-server/src/main/java/org/apache/lens/server/metastore/MetastoreResource.java index 7451aa9..0af6a34 100644 --- a/lens-server/src/main/java/org/apache/lens/server/metastore/MetastoreResource.java +++ b/lens-server/src/main/java/org/apache/lens/server/metastore/MetastoreResource.java @@ -710,7 +710,6 @@ public class MetastoreResource { return Entity.FACT.getAll(sessionid); } - /** * Get all segmentations in the current database * @@ -760,15 +759,15 @@ public class MetastoreResource { * * @param sessionid The sessionid in which user is working * @param factName The fact table name - * @return JAXB representation of {@link XFactTable} + * @return JAXB representation of {@link XFact} */ @GET @Path("/facts/{factName}") - public JAXBElement<XFactTable> getFactTable(@QueryParam("sessionid") LensSessionHandle sessionid, + public JAXBElement<XFact> getFactTable(@QueryParam("sessionid") LensSessionHandle sessionid, @PathParam("factName") String factName) throws LensException { checkSessionId(sessionid); - return X_CUBE_OBJECT_FACTORY.createXFactTable(getSvc().getFactTable(sessionid, factName)); + return X_CUBE_OBJECT_FACTORY.createXFact(getSvc().getFactTable(sessionid, factName)); } /** @@ -791,13 +790,13 @@ public class MetastoreResource { * Create a new fact tabble * * @param sessionid The sessionid in which user is working - * @param fact The {@link XFactTable} representation of the fact table definition + * @param fact The {@link XFact} representation of the fact table definition * @return {@link APIResult} with state {@link Status#SUCCEEDED}, if create was successful. {@link APIResult} with * state {@link Status#FAILED}, if create has failed */ @POST @Path("/facts") - public APIResult createFactTable(@QueryParam("sessionid") LensSessionHandle sessionid, XFactTable fact) + public APIResult createFactTable(@QueryParam("sessionid") LensSessionHandle sessionid, XFact fact) throws LensException { checkSessionId(sessionid); log.info("Create fact table"); @@ -823,20 +822,19 @@ public class MetastoreResource { return success(); } - /** * Update fact table definition * * @param sessionid The sessionid in which user is working * @param factName name of the fact table - * @param fact The {@link XFactTable} representation of the updated fact table definition + * @param fact The {@link XFact} representation of the updated fact table definition * @return {@link APIResult} with state {@link Status#SUCCEEDED}, if update was successful. {@link APIResult} with * state {@link Status#FAILED}, if update has failed */ @PUT @Path("/facts/{factName}") public APIResult updateFactTable(@QueryParam("sessionid") LensSessionHandle sessionid, - @PathParam("factName") String factName, XFactTable fact) + @PathParam("factName") String factName, XFact fact) throws LensException { checkSessionId(sessionid); getSvc().updateFactTable(sessionid, fact); @@ -880,7 +878,6 @@ public class MetastoreResource { return Entity.FACT.delete(sessionid, factName, cascade); } - /** * Drop the segmentation, specified by name * http://git-wip-us.apache.org/repos/asf/lens/blob/5de45e0f/lens-server/src/test/java/org/apache/lens/server/common/RestAPITestUtil.java ---------------------------------------------------------------------- diff --git a/lens-server/src/test/java/org/apache/lens/server/common/RestAPITestUtil.java b/lens-server/src/test/java/org/apache/lens/server/common/RestAPITestUtil.java index df4e07a..5c82d74 100644 --- a/lens-server/src/test/java/org/apache/lens/server/common/RestAPITestUtil.java +++ b/lens-server/src/test/java/org/apache/lens/server/common/RestAPITestUtil.java @@ -36,10 +36,7 @@ import javax.xml.bind.JAXBElement; import org.apache.lens.api.APIResult; import org.apache.lens.api.LensConf; import org.apache.lens.api.LensSessionHandle; -import org.apache.lens.api.metastore.ObjectFactory; -import org.apache.lens.api.metastore.XCube; -import org.apache.lens.api.metastore.XFactTable; -import org.apache.lens.api.metastore.XStorage; +import org.apache.lens.api.metastore.*; import org.apache.lens.api.query.*; import org.apache.lens.api.result.LensAPIResult; @@ -161,7 +158,7 @@ public class RestAPITestUtil { APIResult result = target.path("metastore").path("facts").queryParam("sessionid", sessionId) .request(mt).post(Entity.entity( - new GenericEntity<JAXBElement<XFactTable>>(cubeObjectFactory.createXFactTable(factTable)) { + new GenericEntity<JAXBElement<XFact>>(cubeObjectFactory.createXFact(factTable)) { }, mt), APIResult.class); checkResponse(result);