LENS-828 : Adds validation for derived cube creation
Project: http://git-wip-us.apache.org/repos/asf/lens/repo Commit: http://git-wip-us.apache.org/repos/asf/lens/commit/7b5f4a09 Tree: http://git-wip-us.apache.org/repos/asf/lens/tree/7b5f4a09 Diff: http://git-wip-us.apache.org/repos/asf/lens/diff/7b5f4a09 Branch: refs/heads/LENS-581 Commit: 7b5f4a09a9471fdedc25e955cc4fd6990e89f1ef Parents: bc86587 Author: Rajat Khandelwal <[email protected]> Authored: Wed Nov 18 13:55:59 2015 +0530 Committer: Amareshwari Sriramadasu <[email protected]> Committed: Wed Nov 18 13:55:59 2015 +0530 ---------------------------------------------------------------------- lens-api/src/main/resources/lens-errors.conf | 12 +++++- .../lens/cube/error/LensCubeErrorCode.java | 3 +- .../org/apache/lens/cube/metadata/Cube.java | 10 ++--- .../lens/cube/metadata/CubeMetastoreClient.java | 2 +- .../apache/lens/cube/metadata/DerivedCube.java | 43 ++++++++++++++++++-- .../cube/metadata/TestCubeMetastoreClient.java | 8 ++-- .../apache/lens/cube/parse/CubeTestSetup.java | 17 ++++++-- .../metastore/CubeMetastoreServiceImpl.java | 13 +----- .../apache/lens/server/metastore/JAXBUtils.java | 30 +++++++------- .../server/metastore/TestMetastoreService.java | 36 ++++++++++++---- 10 files changed, 120 insertions(+), 54 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/lens/blob/7b5f4a09/lens-api/src/main/resources/lens-errors.conf ---------------------------------------------------------------------- diff --git a/lens-api/src/main/resources/lens-errors.conf b/lens-api/src/main/resources/lens-errors.conf index a582dc2..7526456 100644 --- a/lens-api/src/main/resources/lens-errors.conf +++ b/lens-api/src/main/resources/lens-errors.conf @@ -99,7 +99,7 @@ lensServerErrors = [ # lensCubeErrors: Defined for lens-cube module -lensCubeErrors = [ +lensCubeErrorsForQuery = [ { errorCode = 3001 @@ -284,6 +284,16 @@ lensCubeErrors = [ } ] +lensCubeErrorsForMetastore = [ + { + errorCode = 3101 + httpStatusCode = ${BAD_REQUEST} + errorMsg = "Problem in submitting entity: %s" + } +] + +lensCubeErrors = ${lensCubeErrorsForQuery}${lensCubeErrorsForMetastore} + # Overriding errors in lens-errors.conf via lens-errors-override.conf: # # Step 1: Copy contents of lens-errors.conf to lens-errors-override.conf http://git-wip-us.apache.org/repos/asf/lens/blob/7b5f4a09/lens-cube/src/main/java/org/apache/lens/cube/error/LensCubeErrorCode.java ---------------------------------------------------------------------- diff --git a/lens-cube/src/main/java/org/apache/lens/cube/error/LensCubeErrorCode.java b/lens-cube/src/main/java/org/apache/lens/cube/error/LensCubeErrorCode.java index 73a584f..2119b64 100644 --- a/lens-cube/src/main/java/org/apache/lens/cube/error/LensCubeErrorCode.java +++ b/lens-cube/src/main/java/org/apache/lens/cube/error/LensCubeErrorCode.java @@ -52,7 +52,8 @@ public enum LensCubeErrorCode { NO_CANDIDATE_DIM_AVAILABLE(3027, 1100), NO_CANDIDATE_FACT_AVAILABLE(3028, 1200), NO_CANDIDATE_DIM_STORAGE_TABLES(3029, 1300), - NO_STORAGE_TABLE_AVAIABLE(3030, 1400); + NO_STORAGE_TABLE_AVAIABLE(3030, 1400), + ERROR_IN_ENTITY_DEFINITION(3101, 100); public LensErrorInfo getLensErrorInfo() { return this.errorInfo; http://git-wip-us.apache.org/repos/asf/lens/blob/7b5f4a09/lens-cube/src/main/java/org/apache/lens/cube/metadata/Cube.java ---------------------------------------------------------------------- diff --git a/lens-cube/src/main/java/org/apache/lens/cube/metadata/Cube.java b/lens-cube/src/main/java/org/apache/lens/cube/metadata/Cube.java index 98fb92e..f09da37 100644 --- a/lens-cube/src/main/java/org/apache/lens/cube/metadata/Cube.java +++ b/lens-cube/src/main/java/org/apache/lens/cube/metadata/Cube.java @@ -205,19 +205,19 @@ public class Cube extends AbstractBaseTable implements CubeInterface { } public CubeDimAttribute getDimAttributeByName(String dimension) { - return dimMap.get(dimension == null ? dimension : dimension.toLowerCase()); + return dimMap.get(dimension == null ? null : dimension.toLowerCase()); } public CubeMeasure getMeasureByName(String measure) { - return measureMap.get(measure == null ? measure : measure.toLowerCase()); + return measureMap.get(measure == null ? null : measure.toLowerCase()); } public CubeColumn getColumnByName(String column) { - CubeColumn cubeCol = (CubeColumn) super.getExpressionByName(column); + CubeColumn cubeCol = super.getExpressionByName(column); if (cubeCol == null) { - cubeCol = (CubeColumn) getMeasureByName(column); + cubeCol = getMeasureByName(column); if (cubeCol == null) { - cubeCol = (CubeColumn) getDimAttributeByName(column); + cubeCol = getDimAttributeByName(column); } } return cubeCol; http://git-wip-us.apache.org/repos/asf/lens/blob/7b5f4a09/lens-cube/src/main/java/org/apache/lens/cube/metadata/CubeMetastoreClient.java ---------------------------------------------------------------------- diff --git a/lens-cube/src/main/java/org/apache/lens/cube/metadata/CubeMetastoreClient.java b/lens-cube/src/main/java/org/apache/lens/cube/metadata/CubeMetastoreClient.java index daf7434..f945e0f 100644 --- a/lens-cube/src/main/java/org/apache/lens/cube/metadata/CubeMetastoreClient.java +++ b/lens-cube/src/main/java/org/apache/lens/cube/metadata/CubeMetastoreClient.java @@ -651,7 +651,7 @@ public class CubeMetastoreClient { * @throws HiveException */ public void createDerivedCube(String parent, String name, Set<String> measures, Set<String> dimensions, - Map<String, String> properties, double weight) throws HiveException { + Map<String, String> properties, double weight) throws HiveException, LensException { DerivedCube cube = new DerivedCube(name, measures, dimensions, properties, weight, (Cube) getCube(parent)); createCube(cube); } http://git-wip-us.apache.org/repos/asf/lens/blob/7b5f4a09/lens-cube/src/main/java/org/apache/lens/cube/metadata/DerivedCube.java ---------------------------------------------------------------------- diff --git a/lens-cube/src/main/java/org/apache/lens/cube/metadata/DerivedCube.java b/lens-cube/src/main/java/org/apache/lens/cube/metadata/DerivedCube.java index e7012f7..3c30f78 100644 --- a/lens-cube/src/main/java/org/apache/lens/cube/metadata/DerivedCube.java +++ b/lens-cube/src/main/java/org/apache/lens/cube/metadata/DerivedCube.java @@ -20,11 +20,16 @@ package org.apache.lens.cube.metadata; import java.util.*; +import org.apache.lens.cube.error.LensCubeErrorCode; +import org.apache.lens.server.api.error.LensException; + import org.apache.commons.lang.StringUtils; import org.apache.hadoop.hive.metastore.api.FieldSchema; import org.apache.hadoop.hive.ql.metadata.HiveException; import org.apache.hadoop.hive.ql.metadata.Table; +import com.google.common.collect.Lists; + public class DerivedCube extends AbstractCubeTable implements CubeInterface { private static final List<FieldSchema> COLUMNS = new ArrayList<FieldSchema>(); @@ -37,12 +42,12 @@ public class DerivedCube extends AbstractCubeTable implements CubeInterface { private final Set<String> measures = new HashSet<String>(); private final Set<String> dimensions = new HashSet<String>(); - public DerivedCube(String name, Set<String> measures, Set<String> dimensions, Cube parent) { + public DerivedCube(String name, Set<String> measures, Set<String> dimensions, Cube parent) throws LensException { this(name, measures, dimensions, new HashMap<String, String>(), 0L, parent); } public DerivedCube(String name, Set<String> measures, Set<String> dimensions, Map<String, String> properties, - double weight, Cube parent) { + double weight, Cube parent) throws LensException { super(name, COLUMNS, properties, weight); for (String msr : measures) { this.measures.add(msr.toLowerCase()); @@ -51,10 +56,42 @@ public class DerivedCube extends AbstractCubeTable implements CubeInterface { this.dimensions.add(dim.toLowerCase()); } this.parent = parent; - + validate(); addProperties(); } + public void validate() throws LensException { + List<String> measuresNotInParentCube = Lists.newArrayList(); + List<String> dimAttributesNotInParentCube = Lists.newArrayList(); + for (String msr : measures) { + if (parent.getMeasureByName(msr) == null) { + measuresNotInParentCube.add(msr); + } + } + for (String dim : dimensions) { + if (parent.getDimAttributeByName(dim) == null) { + dimAttributesNotInParentCube.add(dim); + } + } + StringBuilder validationErrorStringBuilder = new StringBuilder(); + String sep = ""; + boolean invalid = false; + if (!measuresNotInParentCube.isEmpty()) { + validationErrorStringBuilder.append(sep).append("Measures ").append(measuresNotInParentCube); + sep = " and "; + invalid = true; + } + if (!dimAttributesNotInParentCube.isEmpty()) { + validationErrorStringBuilder.append(sep).append("Dim Attributes ").append(dimAttributesNotInParentCube); + invalid = true; + } + if (invalid) { + throw new LensException(LensCubeErrorCode.ERROR_IN_ENTITY_DEFINITION.getLensErrorInfo(), + "Derived cube invalid: " + validationErrorStringBuilder.append(" were not present in " + "parent cube ") + .append(parent)); + } + } + public DerivedCube(Table tbl, Cube parent) { super(tbl); this.measures.addAll(getMeasures(getName(), getProperties())); http://git-wip-us.apache.org/repos/asf/lens/blob/7b5f4a09/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 7d5ed0f..6a2dc50 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 @@ -114,7 +114,7 @@ public class TestCubeMetastoreClient { } @BeforeClass - public static void setup() throws HiveException, AlreadyExistsException, ParseException { + public static void setup() throws HiveException, AlreadyExistsException, LensException { SessionState.start(conf); now = new Date(); Calendar cal = Calendar.getInstance(); @@ -158,7 +158,7 @@ public class TestCubeMetastoreClient { } private static void defineCube(String cubeName, String cubeNameWithProps, String derivedCubeName, - String derivedCubeNameWithProps) throws ParseException { + String derivedCubeNameWithProps) throws LensException { cubeMeasures = new HashSet<CubeMeasure>(); cubeMeasures.add(new ColumnMeasure( new FieldSchema("msr1", "int", "first measure"), null, null, null, null, null, null, null, 0.0, 9999.0)); @@ -299,7 +299,7 @@ public class TestCubeMetastoreClient { new DerivedCube(derivedCubeNameWithProps, measures, dimensions, CUBE_PROPERTIES, 0L, cubeWithProps); } - private static void defineUberDims() throws ParseException { + private static void defineUberDims() { // Define zip dimension zipAttrs.add(new BaseDimAttribute(new FieldSchema("zipcode", "int", "code"))); zipAttrs.add(new BaseDimAttribute(new FieldSchema("f1", "string", "field1"))); @@ -2541,7 +2541,7 @@ public class TestCubeMetastoreClient { } @Test(priority = 3) - public void testCaching() throws HiveException, ParseException { + public void testCaching() throws HiveException, LensException { client = CubeMetastoreClient.getInstance(conf); CubeMetastoreClient client2 = CubeMetastoreClient.getInstance(new HiveConf(TestCubeMetastoreClient.class)); assertEquals(5, client.getAllCubes().size()); http://git-wip-us.apache.org/repos/asf/lens/blob/7b5f4a09/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 826f6b6..92f5067 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 @@ -27,6 +27,7 @@ import static org.apache.lens.cube.metadata.UpdatePeriod.*; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.assertTrue; import java.text.DateFormat; import java.text.SimpleDateFormat; @@ -585,7 +586,7 @@ public class CubeTestSetup { Set<ExprColumn> exprs; - private void createCube(CubeMetastoreClient client) throws HiveException, ParseException { + private void createCube(CubeMetastoreClient client) throws HiveException, ParseException, LensException { cubeMeasures = new HashSet<CubeMeasure>(); cubeMeasures.add(new ColumnMeasure(new FieldSchema("msr1", "int", "first measure"))); cubeMeasures.add(new ColumnMeasure(new FieldSchema("msr2", "float", "second measure"), "Measure2", null, "SUM", @@ -749,8 +750,18 @@ public class CubeTestSetup { Set<String> dimensions = new HashSet<String>(); dimensions.add("dim1"); dimensions.add("dim2"); - client - .createDerivedCube(TEST_CUBE_NAME, DERIVED_CUBE_NAME, measures, dimensions, new HashMap<String, String>(), 5L); + // Try creating derived cube with non existant dim/measures + try{ + client.createDerivedCube(TEST_CUBE_NAME, DERIVED_CUBE_NAME, + Sets.newHashSet("random_measure"), Sets.newHashSet("random_dim_attribute"), + new HashMap<String, String>(), 5L); + } catch(LensException e) { + assertTrue(e.getMessage().contains("random_measure")); + assertTrue(e.getMessage().contains("random_dim_attribute")); + assertTrue(e.getMessage().contains("not present")); + } + client.createDerivedCube(TEST_CUBE_NAME, DERIVED_CUBE_NAME, + measures, dimensions, new HashMap<String, String>(), 5L); } private void createBaseAndDerivedCubes(CubeMetastoreClient client) http://git-wip-us.apache.org/repos/asf/lens/blob/7b5f4a09/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 ea913ad..27f9e0e 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 @@ -28,7 +28,6 @@ import javax.ws.rs.NotFoundException; import org.apache.lens.api.LensSessionHandle; import org.apache.lens.api.metastore.*; import org.apache.lens.cube.metadata.*; -import org.apache.lens.cube.metadata.Dimension; import org.apache.lens.cube.metadata.timeline.PartitionTimeline; import org.apache.lens.server.BaseLensService; import org.apache.lens.server.LensServerConf; @@ -40,10 +39,10 @@ import org.apache.lens.server.session.LensSessionImpl; import org.apache.commons.lang.StringUtils; import org.apache.hadoop.hive.metastore.IMetaStoreClient; import org.apache.hadoop.hive.metastore.api.*; -import org.apache.hadoop.hive.ql.metadata.*; +import org.apache.hadoop.hive.ql.metadata.Hive; +import org.apache.hadoop.hive.ql.metadata.HiveException; import org.apache.hadoop.hive.ql.metadata.Partition; import org.apache.hadoop.hive.ql.metadata.Table; -import org.apache.hadoop.hive.ql.parse.ParseException; import org.apache.hive.service.cli.CLIService; import com.google.common.collect.Lists; @@ -200,8 +199,6 @@ public class CubeMetastoreServiceImpl extends BaseLensService implements CubeMet log.info("Created cube " + cube.getName()); } catch (HiveException e) { throw new LensException(e); - } catch (ParseException e) { - throw new LensException(e); } finally { release(sessionid); } @@ -264,8 +261,6 @@ public class CubeMetastoreServiceImpl extends BaseLensService implements CubeMet log.info("Cube updated " + cube.getName()); } catch (HiveException e) { throw new LensException(e); - } catch (ParseException e) { - throw new LensException(e); } finally { release(sessionid); } @@ -1108,8 +1103,6 @@ public class CubeMetastoreServiceImpl extends BaseLensService implements CubeMet log.info("Created dimension " + dimension.getName()); } catch (HiveException e) { throw new LensException(e); - } catch (ParseException e) { - throw new LensException(e); } finally { release(sessionid); } @@ -1152,8 +1145,6 @@ public class CubeMetastoreServiceImpl extends BaseLensService implements CubeMet log.info("Altered dimension " + dimName); } catch (HiveException e) { throw new LensException(e); - } catch (ParseException e) { - throw new LensException(e); } finally { release(sessionid); } http://git-wip-us.apache.org/repos/asf/lens/blob/7b5f4a09/lens-server/src/main/java/org/apache/lens/server/metastore/JAXBUtils.java ---------------------------------------------------------------------- diff --git a/lens-server/src/main/java/org/apache/lens/server/metastore/JAXBUtils.java b/lens-server/src/main/java/org/apache/lens/server/metastore/JAXBUtils.java index 1ed81eb..f5db7bc 100644 --- a/lens-server/src/main/java/org/apache/lens/server/metastore/JAXBUtils.java +++ b/lens-server/src/main/java/org/apache/lens/server/metastore/JAXBUtils.java @@ -19,6 +19,7 @@ package org.apache.lens.server.metastore; import java.lang.reflect.Constructor; +import java.text.ParseException; import java.util.*; import javax.ws.rs.WebApplicationException; @@ -30,6 +31,7 @@ import org.apache.lens.api.metastore.*; import org.apache.lens.cube.metadata.*; import org.apache.lens.cube.metadata.ExprColumn.ExprSpec; import org.apache.lens.cube.metadata.ReferencedDimAtrribute.ChainRefCol; +import org.apache.lens.server.api.error.LensException; import org.apache.hadoop.hive.metastore.TableType; import org.apache.hadoop.hive.metastore.api.FieldSchema; @@ -39,7 +41,6 @@ import org.apache.hadoop.hive.ql.io.HiveOutputFormat; import org.apache.hadoop.hive.ql.metadata.HiveException; import org.apache.hadoop.hive.ql.metadata.Partition; import org.apache.hadoop.hive.ql.metadata.Table; -import org.apache.hadoop.hive.ql.parse.ParseException; import org.apache.hadoop.hive.serde.serdeConstants; import org.apache.hadoop.mapred.InputFormat; @@ -59,13 +60,13 @@ public final class JAXBUtils { private static final ObjectFactory XCF = new ObjectFactory(); /** - * Create a hive ql cube obejct from corresponding JAXB object + * Create a hive ql cube object from corresponding JAXB object * * @param cube JAXB Cube * @return {@link Cube} - * @throws ParseException + * @throws LensException */ - public static CubeInterface hiveCubeFromXCube(XCube cube, Cube parent) throws ParseException { + public static CubeInterface hiveCubeFromXCube(XCube cube, Cube parent) throws LensException { if (cube instanceof XDerivedCube) { XDerivedCube dcube = (XDerivedCube) cube; Set<String> dims = new LinkedHashSet<String>(); @@ -348,7 +349,7 @@ public final class JAXBUtils { } refspec.getChainRefColumn().add(xcc); } - xd.setJoinKey(Boolean.valueOf(false)); + xd.setJoinKey(false); } else { List<TableReference> dimRefs = rd.getReferences(); refspec.setTableReferences(new XTableReferences()); @@ -477,7 +478,7 @@ public final class JAXBUtils { return jc; } - public static ExprColumn hiveExprColumnFromXExprColumn(XExprColumn xe) throws ParseException { + public static ExprColumn hiveExprColumnFromXExprColumn(XExprColumn xe) { ExprColumn ec = new ExprColumn(new FieldSchema(xe.getName(), xe.getType().toLowerCase(), xe.getDescription()), xe.getDisplayString(), @@ -601,7 +602,7 @@ public final class JAXBUtils { try { Class<?> clazz = Class.forName(xs.getClassname()); Constructor<?> constructor = clazz.getConstructor(String.class); - storage = (Storage) constructor.newInstance(new Object[]{xs.getName()}); + storage = (Storage) constructor.newInstance(xs.getName()); storage.addProperties(mapFromXProperties(xs.getProperties())); return storage; } catch (Exception e) { @@ -664,14 +665,12 @@ public final class JAXBUtils { public static CubeDimensionTable cubeDimTableFromDimTable(XDimensionTable dimensionTable) { - CubeDimensionTable cdim = new CubeDimensionTable(dimensionTable.getDimensionName(), + return new CubeDimensionTable(dimensionTable.getDimensionName(), dimensionTable.getTableName(), fieldSchemaListFromColumns(dimensionTable.getColumns()), dimensionTable.getWeight(), dumpPeriodsFromStorageTables(dimensionTable.getStorageTables()), mapFromXProperties(dimensionTable.getProperties())); - - return cdim; } public static CubeFactTable cubeFactFromFactTable(XFactTable fact) { @@ -870,7 +869,7 @@ public final class JAXBUtils { xp.getNonTimePartitionSpec().getPartSpecElement().add(partSpecElement); } } - } catch (java.text.ParseException exc) { + } catch (ParseException exc) { log.debug("can't form time part spec from " + partSpec, exc); xp.setTimePartitionSpec(null); xp.setNonTimePartitionSpec(null); @@ -881,17 +880,16 @@ public final class JAXBUtils { return xp; } - public static void updatePartitionFromXPartition(Partition partition, XPartition xp) - throws ClassNotFoundException, HiveException { + public static void updatePartitionFromXPartition(Partition partition, XPartition xp) throws ClassNotFoundException { partition.getParameters().putAll(mapFromXProperties(xp.getPartitionParameters())); partition.getTPartition().getSd().getSerdeInfo().setParameters(mapFromXProperties(xp.getSerdeParameters())); partition.setLocation(xp.getLocation()); if (xp.getInputFormat() != null) { - partition.setInputFormatClass((Class<? extends InputFormat>) Class.forName(xp.getInputFormat())); + partition.setInputFormatClass(Class.forName(xp.getInputFormat()).asSubclass(InputFormat.class)); } if (xp.getOutputFormat() != null) { Class<? extends HiveOutputFormat> outputFormatClass = - (Class<? extends HiveOutputFormat>) Class.forName(xp.getOutputFormat()); + Class.forName(xp.getOutputFormat()).asSubclass(HiveOutputFormat.class); partition.setOutputFormatClass(outputFormatClass); // Again a hack, for the issue described in HIVE-11278 partition.getTPartition().getSd().setOutputFormat( @@ -926,7 +924,7 @@ public final class JAXBUtils { return ret; } - public static Dimension dimensionFromXDimension(XDimension dimension) throws ParseException { + public static Dimension dimensionFromXDimension(XDimension dimension) { Set<CubeDimAttribute> dims = new LinkedHashSet<CubeDimAttribute>(); for (XDimAttribute xd : dimension.getAttributes().getDimAttribute()) { dims.add(hiveDimAttrFromXDimAttr(xd)); http://git-wip-us.apache.org/repos/asf/lens/blob/7b5f4a09/lens-server/src/test/java/org/apache/lens/server/metastore/TestMetastoreService.java ---------------------------------------------------------------------- diff --git a/lens-server/src/test/java/org/apache/lens/server/metastore/TestMetastoreService.java b/lens-server/src/test/java/org/apache/lens/server/metastore/TestMetastoreService.java index ca0fe56..e6a798a 100644 --- a/lens-server/src/test/java/org/apache/lens/server/metastore/TestMetastoreService.java +++ b/lens-server/src/test/java/org/apache/lens/server/metastore/TestMetastoreService.java @@ -417,7 +417,7 @@ public class TestMetastoreService extends LensJerseyTest { return cube; } - private XDerivedCube createDerivedCube(String cubeName, String parent) throws Exception { + private XDerivedCube createDerivedCube(String cubeName, String parent, boolean addExtraFields) throws Exception { XDerivedCube cube = cubeObjectFactory.createXDerivedCube(); cube.setName(cubeName); cube.setDimAttrNames(new XDimAttrNames()); @@ -426,7 +426,10 @@ public class TestMetastoreService extends LensJerseyTest { cube.getDimAttrNames().getAttrName().add("dim1"); cube.getMeasureNames().getMeasureName().add("msr1"); - + if (addExtraFields) { + cube.getDimAttrNames().getAttrName().add("random_dim"); + cube.getMeasureNames().getMeasureName().add("random_measure"); + } XProperty xp1 = cubeObjectFactory.createXProperty(); xp1.setName("derived.foo"); xp1.setValue("derived.bar"); @@ -469,13 +472,20 @@ public class TestMetastoreService extends LensJerseyTest { } assertTrue(foundcube); - + // create invalid derived cube + XCube dcube = createDerivedCube("testderived", "testCube1", true); + result = target.queryParam("sessionid", lensSessionId).request( + mediaType).post(Entity.xml(cubeObjectFactory.createXCube(dcube)), APIResult.class); + assertEquals(result.getStatus(), Status.FAILED); + assertEquals(result.getMessage(), "ERROR_IN_ENTITY_DEFINITION[Derived cube invalid: " + + "Measures [random_measure] and Dim Attributes " + + "[random_dim] were not present in parent cube testcube1]"); // create derived cube - final XCube dcube = createDerivedCube("testderived", "testCube1"); + dcube = createDerivedCube("testderived", "testCube1", false); result = target.queryParam("sessionid", lensSessionId).request( mediaType).post(Entity.xml(cubeObjectFactory.createXCube(dcube)), APIResult.class); assertNotNull(result); - assertEquals(result.getStatus(), APIResult.Status.SUCCEEDED); + assertEquals(result.getStatus(), Status.SUCCEEDED); cubes = target().path("metastore/cubes").queryParam("sessionid", lensSessionId).request(mediaType) .get(StringList.class); @@ -706,7 +716,7 @@ public class TestMetastoreService extends LensJerseyTest { Assert.assertTrue(links.get(1).isMapsToMany()); Assert.assertEquals(links.get(1).toString(), "testdim.col1[n]"); - final XDerivedCube dcube = createDerivedCube("testGetDerivedCube", "testGetCube"); + final XDerivedCube dcube = createDerivedCube("testGetDerivedCube", "testGetCube", false); target = target().path("metastore").path("cubes"); // Create this cube first element = cubeObjectFactory.createXCube(dcube); @@ -746,7 +756,7 @@ public class TestMetastoreService extends LensJerseyTest { target.queryParam("sessionid", lensSessionId).request(mediaType).post(Entity.xml(element), APIResult.class); assertEquals(result.getStatus(), APIResult.Status.SUCCEEDED); - final XCube dcube = createDerivedCube("test_drop_derived_cube", "test_drop_cube"); + final XCube dcube = createDerivedCube("test_drop_derived_cube", "test_drop_cube", false); target = target().path("metastore").path("cubes"); // Create this cube first element = cubeObjectFactory.createXCube(dcube); @@ -841,7 +851,15 @@ public class TestMetastoreService extends LensJerseyTest { assertNotNull(hcube.getDimAttributeByName("dim3")); assertEquals(((AbstractCubeTable) hcube).getProperties().get("foo2"), "bar2"); - final XDerivedCube dcube = createDerivedCube("test_update_derived", cubeName); + XDerivedCube dcube = createDerivedCube("test_update_derived", cubeName, true); + element = cubeObjectFactory.createXCube(dcube); + result = + target.queryParam("sessionid", lensSessionId).request(mediaType).post(Entity.xml(element), APIResult.class); + assertEquals(result.getStatus(), Status.FAILED); + assertEquals(result.getMessage(), "ERROR_IN_ENTITY_DEFINITION[Derived cube invalid: " + + "Measures [random_measure] and Dim Attributes " + + "[random_dim] were not present in parent cube test_update]"); + dcube = createDerivedCube("test_update_derived", cubeName, false); // Create this cube first element = cubeObjectFactory.createXCube(dcube); result = @@ -1262,7 +1280,7 @@ public class TestMetastoreService extends LensJerseyTest { assertEquals(col4h3.getType(), "string"); assertEquals(col4h3.getChainRefColumns().get(0).getChainName(), "chain1"); assertEquals(col4h3.getChainRefColumns().get(0).getRefColumn(), "col2"); - assertEquals(col4h3.getNumOfDistinctValues().get(), (Long)1000L); + assertEquals(col4h3.getNumOfDistinctValues().get(), (Long) 1000L); assertNotNull(dim.getAttributeByName("col5")); ReferencedDimAtrribute col5 = (ReferencedDimAtrribute) dim.getAttributeByName("col5"); assertEquals(col5.getDescription(), "ref column");
