You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lens.apache.org by am...@apache.org on 2015/04/15 13:03:30 UTC

incubator-lens git commit: LENS-441 : Add command to get all dimtables of a dimension and get all facts of a cube (Rajat Khandelwal via amareshwari)

Repository: incubator-lens
Updated Branches:
  refs/heads/master e3486e03a -> 309f62cc0


LENS-441 : Add command to get all dimtables of a dimension and get all facts of a cube (Rajat Khandelwal via amareshwari)


Project: http://git-wip-us.apache.org/repos/asf/incubator-lens/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-lens/commit/309f62cc
Tree: http://git-wip-us.apache.org/repos/asf/incubator-lens/tree/309f62cc
Diff: http://git-wip-us.apache.org/repos/asf/incubator-lens/diff/309f62cc

Branch: refs/heads/master
Commit: 309f62cc0863615383ccb69f815bf55887831414
Parents: e3486e0
Author: Rajat Khandelwal <pr...@apache.org>
Authored: Wed Apr 15 06:03:20 2015 -0500
Committer: Amareshwari Sriramadasu <am...@apache.org>
Committed: Wed Apr 15 06:03:20 2015 -0500

----------------------------------------------------------------------
 .../commands/LensDimensionTableCommands.java    |  5 +-
 .../lens/cli/commands/LensFactCommands.java     |  5 +-
 .../cli/TestLensDimensionTableCommands.java     | 47 ++++++++++++--
 .../apache/lens/cli/TestLensFactCommands.java   | 22 +++++--
 lens-cli/src/test/resources/dim_table2.xml      |  2 +-
 .../java/org/apache/lens/client/LensClient.java |  9 ++-
 .../apache/lens/client/LensMetadataClient.java  | 34 ++++++++--
 .../lens/cube/metadata/CubeMetastoreClient.java | 39 ++++++-----
 .../lens/cube/parse/CandidateTableResolver.java |  2 +-
 .../cube/metadata/TestCubeMetastoreClient.java  | 12 ++--
 .../api/metastore/CubeMetastoreService.java     | 19 ++----
 .../metastore/CubeMetastoreServiceImpl.java     | 68 +++++++++-----------
 .../server/metastore/MetastoreResource.java     | 39 +++++++++--
 13 files changed, 202 insertions(+), 101 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/309f62cc/lens-cli/src/main/java/org/apache/lens/cli/commands/LensDimensionTableCommands.java
----------------------------------------------------------------------
diff --git a/lens-cli/src/main/java/org/apache/lens/cli/commands/LensDimensionTableCommands.java b/lens-cli/src/main/java/org/apache/lens/cli/commands/LensDimensionTableCommands.java
index c61be09..c3b7f37 100644
--- a/lens-cli/src/main/java/org/apache/lens/cli/commands/LensDimensionTableCommands.java
+++ b/lens-cli/src/main/java/org/apache/lens/cli/commands/LensDimensionTableCommands.java
@@ -45,8 +45,9 @@ public class LensDimensionTableCommands extends BaseLensCommand implements Comma
    * @return the string
    */
   @CliCommand(value = "show dimtables", help = "show list of dimension tables in database")
-  public String showDimensionTables() {
-    List<String> dims = getClient().getAllDimensionTables();
+  public String showDimensionTables(
+    @CliOption(key = {"", "dimension"}, mandatory = false, help = "<optional dimension name>") String dimensionName) {
+    List<String> dims = getClient().getAllDimensionTables(dimensionName);
     if (dims != null) {
       return Joiner.on("\n").join(dims);
     } else {

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/309f62cc/lens-cli/src/main/java/org/apache/lens/cli/commands/LensFactCommands.java
----------------------------------------------------------------------
diff --git a/lens-cli/src/main/java/org/apache/lens/cli/commands/LensFactCommands.java b/lens-cli/src/main/java/org/apache/lens/cli/commands/LensFactCommands.java
index a69d361..1e8abf9 100644
--- a/lens-cli/src/main/java/org/apache/lens/cli/commands/LensFactCommands.java
+++ b/lens-cli/src/main/java/org/apache/lens/cli/commands/LensFactCommands.java
@@ -45,8 +45,9 @@ public class LensFactCommands extends BaseLensCommand implements CommandMarker {
    * @return the string
    */
   @CliCommand(value = "show facts", help = "display list of fact tables in database")
-  public String showFacts() {
-    List<String> facts = getClient().getAllFactTables();
+  public String showFacts(
+    @CliOption(key = {"", "cube"}, mandatory = false, help = "<optional cube name>") String cubeName) {
+    List<String> facts = getClient().getAllFactTables(cubeName);
     if (facts != null) {
       return Joiner.on("\n").join(facts);
     } else {

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/309f62cc/lens-cli/src/test/java/org/apache/lens/cli/TestLensDimensionTableCommands.java
----------------------------------------------------------------------
diff --git a/lens-cli/src/test/java/org/apache/lens/cli/TestLensDimensionTableCommands.java b/lens-cli/src/test/java/org/apache/lens/cli/TestLensDimensionTableCommands.java
index 5430c7f..5d8d453 100644
--- a/lens-cli/src/test/java/org/apache/lens/cli/TestLensDimensionTableCommands.java
+++ b/lens-cli/src/test/java/org/apache/lens/cli/TestLensDimensionTableCommands.java
@@ -22,6 +22,9 @@ import java.io.*;
 import java.net.URISyntaxException;
 import java.net.URL;
 
+import javax.ws.rs.NotFoundException;
+
+import org.apache.lens.cli.commands.LensDimensionCommands;
 import org.apache.lens.cli.commands.LensDimensionTableCommands;
 import org.apache.lens.client.LensClient;
 
@@ -43,6 +46,7 @@ public class TestLensDimensionTableCommands extends LensCliApplicationTest {
 
   /** The command. */
   private static LensDimensionTableCommands command = null;
+  private static LensDimensionCommands dimensionCommand = null;
 
   private static LensDimensionTableCommands getCommand() {
     if (command == null) {
@@ -53,6 +57,16 @@ public class TestLensDimensionTableCommands extends LensCliApplicationTest {
     return command;
   }
 
+  private static LensDimensionCommands getDimensionCommand() {
+    if (dimensionCommand == null) {
+      LensClient client = new LensClient();
+      dimensionCommand = new LensDimensionCommands();
+      dimensionCommand.setClient(client);
+    }
+    return dimensionCommand;
+  }
+
+
   /**
    * Test dim table commands.
    *
@@ -61,11 +75,23 @@ public class TestLensDimensionTableCommands extends LensCliApplicationTest {
    */
   @Test
   public void testDimTableCommands() throws IOException, URISyntaxException {
+    createDimension();
     addDim1Table("dim_table2", "dim_table2.xml", DIM_LOCAL);
     updateDim1Table();
     testDimStorageActions();
     testDimPartitionActions();
     dropDim1Table();
+    dropDimension();
+  }
+
+  private void dropDimension() {
+    getDimensionCommand().dropDimension("test_dim");
+  }
+
+  private void createDimension() throws URISyntaxException {
+    URL dimensionSpec = TestLensDimensionTableCommands.class.getClassLoader().getResource("test-dimension.xml");
+    getDimensionCommand().createDimension(new File(dimensionSpec.toURI()).getAbsolutePath());
+
   }
 
   /**
@@ -79,7 +105,9 @@ public class TestLensDimensionTableCommands extends LensCliApplicationTest {
   public static synchronized void addDim1Table(String tableName, String specName, String storageName)
     throws IOException {
     LensDimensionTableCommands command = getCommand();
-    String dimList = command.showDimensionTables();
+    String dimList = command.showDimensionTables(null);
+    Assert.assertEquals(command.showDimensionTables("test_dim"), dimList);
+
     // add local storage before adding fact table
     TestLensStorageCommands.addLocalStorage(storageName);
     URL dimSpec = TestLensDimensionTableCommands.class.getClassLoader().getResource(specName);
@@ -91,7 +119,18 @@ public class TestLensDimensionTableCommands extends LensCliApplicationTest {
       Assert.fail("Unable to create dimtable" + e.getMessage());
     }
 
-    dimList = command.showDimensionTables();
+    dimList = command.showDimensionTables(null);
+    Assert.assertEquals(command.showDimensionTables("test_dim"), dimList);
+    try {
+      Assert.assertEquals(command.showDimensionTables("blah"), dimList);
+      Assert.fail();
+    } catch (NotFoundException e) {
+    }
+    try {
+      Assert.assertEquals(command.showDimensionTables("dim_table2"), dimList);
+      Assert.fail();
+    } catch (NotFoundException e) {
+    }
     Assert.assertTrue(dimList.contains(tableName), "dim_table table should be found");
   }
 
@@ -220,10 +259,10 @@ public class TestLensDimensionTableCommands extends LensCliApplicationTest {
    */
   public static void dropDim1Table() {
     LensDimensionTableCommands command = getCommand();
-    String dimList = command.showDimensionTables();
+    String dimList = command.showDimensionTables(null);
     Assert.assertEquals("dim_table2", dimList, "dim_table table should be found");
     command.dropDimensionTable("dim_table2", false);
-    dimList = command.showDimensionTables();
+    dimList = command.showDimensionTables(null);
     Assert.assertEquals("No Dimensions Found", dimList, "Dim tables should not be found");
     TestLensStorageCommands.dropStorage(DIM_LOCAL);
   }

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/309f62cc/lens-cli/src/test/java/org/apache/lens/cli/TestLensFactCommands.java
----------------------------------------------------------------------
diff --git a/lens-cli/src/test/java/org/apache/lens/cli/TestLensFactCommands.java b/lens-cli/src/test/java/org/apache/lens/cli/TestLensFactCommands.java
index 244b9ec..b906f18 100644
--- a/lens-cli/src/test/java/org/apache/lens/cli/TestLensFactCommands.java
+++ b/lens-cli/src/test/java/org/apache/lens/cli/TestLensFactCommands.java
@@ -22,6 +22,8 @@ import java.io.*;
 import java.net.URISyntaxException;
 import java.net.URL;
 
+import javax.ws.rs.NotFoundException;
+
 import org.apache.lens.cli.commands.LensCubeCommands;
 import org.apache.lens.cli.commands.LensFactCommands;
 import org.apache.lens.client.LensClient;
@@ -98,7 +100,8 @@ public class TestLensFactCommands extends LensCliApplicationTest {
    */
   public static void addFact1Table() throws IOException {
     LensFactCommands command = getCommand();
-    String factList = command.showFacts();
+    String factList = command.showFacts(null);
+    Assert.assertEquals(command.showFacts("sample_cube"), factList);
     Assert.assertEquals("No Facts Found", factList, "Fact tables should not be found");
     // add local storage before adding fact table
     TestLensStorageCommands.addLocalStorage(FACT_LOCAL);
@@ -108,7 +111,18 @@ public class TestLensFactCommands extends LensCliApplicationTest {
     } catch (Exception e) {
       Assert.fail("Unable to create fact table" + e.getMessage());
     }
-    factList = command.showFacts();
+    factList = command.showFacts(null);
+    Assert.assertEquals(command.showFacts("sample_cube"), factList);
+    try {
+      Assert.assertEquals(command.showFacts("blah"), factList);
+      Assert.fail();
+    } catch (NotFoundException e) {
+    }
+    try {
+      Assert.assertEquals(command.showFacts("fact1"), factList);
+      Assert.fail();
+    } catch (NotFoundException e) {
+    }
     Assert.assertEquals("fact1", factList, "Fact1 table should be found");
   }
 
@@ -257,10 +271,10 @@ public class TestLensFactCommands extends LensCliApplicationTest {
    */
   public static void dropFact1Table() {
     LensFactCommands command = getCommand();
-    String factList = command.showFacts();
+    String factList = command.showFacts(null);
     Assert.assertEquals("fact1", factList, "Fact1 table should be found");
     command.dropFact("fact1", false);
-    factList = command.showFacts();
+    factList = command.showFacts(null);
     Assert.assertEquals("No Facts Found", factList, "Fact tables should not be found");
     TestLensStorageCommands.dropStorage(FACT_LOCAL);
   }

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/309f62cc/lens-cli/src/test/resources/dim_table2.xml
----------------------------------------------------------------------
diff --git a/lens-cli/src/test/resources/dim_table2.xml b/lens-cli/src/test/resources/dim_table2.xml
index 3631065..1d6e138 100644
--- a/lens-cli/src/test/resources/dim_table2.xml
+++ b/lens-cli/src/test/resources/dim_table2.xml
@@ -19,7 +19,7 @@
   under the License.
 
 -->
-<x_dimension_table dimension_name="test_dim2" table_name="dim_table2" weight="0.0" xmlns="uri:lens:cube:0.1"
+<x_dimension_table dimension_name="test_dim" table_name="dim_table2" weight="0.0" 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 ">
   <columns>
     <column comment="ID" name="id" type="INT" />

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/309f62cc/lens-client/src/main/java/org/apache/lens/client/LensClient.java
----------------------------------------------------------------------
diff --git a/lens-client/src/main/java/org/apache/lens/client/LensClient.java b/lens-client/src/main/java/org/apache/lens/client/LensClient.java
index 449c8ec..016e4ab 100644
--- a/lens-client/src/main/java/org/apache/lens/client/LensClient.java
+++ b/lens-client/src/main/java/org/apache/lens/client/LensClient.java
@@ -212,11 +212,18 @@ public class LensClient {
     return mc.getAllFactTables();
   }
 
-
+  public List<String> getAllFactTables(String cubeName) {
+    LOG.debug("Getting all fact table");
+    return mc.getAllFactTables(cubeName);
+  }
   public List<String> getAllDimensionTables() {
     LOG.debug("Getting all dimension table");
     return mc.getAllDimensionTables();
   }
+  public List<String> getAllDimensionTables(String dimensionName) {
+    LOG.debug("Getting all dimension table");
+    return mc.getAllDimensionTables(dimensionName);
+  }
 
   public List<String> getAllCubes() {
     LOG.debug("Getting all cubes in database");

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/309f62cc/lens-client/src/main/java/org/apache/lens/client/LensMetadataClient.java
----------------------------------------------------------------------
diff --git a/lens-client/src/main/java/org/apache/lens/client/LensMetadataClient.java b/lens-client/src/main/java/org/apache/lens/client/LensMetadataClient.java
index 1e243e8..5e406b5 100644
--- a/lens-client/src/main/java/org/apache/lens/client/LensMetadataClient.java
+++ b/lens-client/src/main/java/org/apache/lens/client/LensMetadataClient.java
@@ -406,25 +406,31 @@ public class LensMetadataClient {
     return result;
   }
 
-  public List<XFactTable> getAllFactTables(String cubeName) {
+  public List<String> getAllFactTables(String cubeName) {
+    if (cubeName == null) {
+      return getAllFactTables();
+    }
     WebTarget target = getMetastoreWebTarget();
-    List<XFactTable> factTables = target.path("cubes").path(cubeName).path("facts")
+    StringList factTables;
+    factTables = target.path("cubes").path(cubeName).path("facts")
       .queryParam("sessionid", this.connection.getSessionHandle())
       .request(MediaType.APPLICATION_XML)
-      .get(new GenericType<List<XFactTable>>() {
-      });
-    return factTables;
+      .get(StringList.class);
+    return factTables.getElements();
   }
 
   public List<String> getAllFactTables() {
     WebTarget target = getMetastoreWebTarget();
-    StringList factTables = target.path("facts")
+    StringList factTables;
+    factTables = target.path("facts")
       .queryParam("sessionid", this.connection.getSessionHandle())
       .request(MediaType.APPLICATION_XML)
       .get(StringList.class);
+
     return factTables.getElements();
   }
 
+
   public APIResult deleteAllFactTables(boolean cascade) {
     WebTarget target = getMetastoreWebTarget();
     APIResult result = target.path("facts")
@@ -636,9 +642,23 @@ public class LensMetadataClient {
   }
 
 
+  public List<String> getAllDimensionTables(String dimensionName) {
+    if (dimensionName == null) {
+      return getAllDimensionTables();
+    }
+    WebTarget target = getMetastoreWebTarget();
+    StringList dimtables;
+    dimtables = target.path("dimensions").path(dimensionName).path("dimtables")
+      .queryParam("sessionid", this.connection.getSessionHandle())
+      .request(MediaType.APPLICATION_XML)
+      .get(StringList.class);
+    return dimtables.getElements();
+  }
+
   public List<String> getAllDimensionTables() {
     WebTarget target = getMetastoreWebTarget();
-    StringList dimtables = target.path("dimtables")
+    StringList dimtables;
+    dimtables = target.path("dimtables")
       .queryParam("sessionid", this.connection.getSessionHandle())
       .request(MediaType.APPLICATION_XML)
       .get(StringList.class);

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/309f62cc/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 fa56213..324002f 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
@@ -111,7 +111,7 @@ public class CubeMetastoreClient {
     String partCol = cube.getPartitionColumnOfTimeDim(timeDimension);
     Date max = new Date(Long.MIN_VALUE);
     boolean updated = false;
-    for (CubeFactTable fact : getAllFactTables(cube)) {
+    for (CubeFactTable fact : getAllFacts(cube)) {
       for (String storage : fact.getStorages()) {
         for (UpdatePeriod updatePeriod : fact.getUpdatePeriods().get(storage)) {
           PartitionTimeline timeline = partitionTimelineCache.get(fact.getName(), storage, updatePeriod,
@@ -1380,6 +1380,9 @@ public class CubeMetastoreClient {
    * @throws HiveException
    */
   public CubeInterface getCube(String tableName) throws HiveException {
+    if (tableName == null) {
+      return null;
+    }
     tableName = tableName.trim().toLowerCase();
     CubeInterface cube = allCubes.get(tableName);
     if (cube == null) {
@@ -1408,6 +1411,9 @@ public class CubeMetastoreClient {
    * @throws HiveException
    */
   public Dimension getDimension(String tableName) throws HiveException {
+    if (tableName == null) {
+      return null;
+    }
     tableName = tableName.trim().toLowerCase();
     Dimension dim = allDims.get(tableName);
     if (dim == null) {
@@ -1617,22 +1623,25 @@ public class CubeMetastoreClient {
    * @return List of fact tables
    * @throws HiveException
    */
-  public List<CubeFactTable> getAllFactTables(CubeInterface cube) throws HiveException {
-    if (cube instanceof Cube) {
-      List<CubeFactTable> cubeFacts = new ArrayList<CubeFactTable>();
-      try {
-        for (CubeFactTable fact : getAllFacts()) {
-          if (fact.getCubeName().equalsIgnoreCase(((Cube) cube).getName())) {
-            cubeFacts.add(fact);
-          }
+  public List<CubeFactTable> getAllFacts(CubeInterface cube) throws HiveException {
+    String cubeName = null;
+    if (cube != null) {
+      if (cube instanceof DerivedCube) {
+        cube = ((DerivedCube) cube).getParent();
+      }
+      cubeName = cube.getName();
+    }
+    List<CubeFactTable> cubeFacts = new ArrayList<CubeFactTable>();
+    try {
+      for (CubeFactTable fact : getAllFacts()) {
+        if (cubeName == null || fact.getCubeName().equalsIgnoreCase(cubeName)) {
+          cubeFacts.add(fact);
         }
-      } catch (HiveException e) {
-        throw new HiveException("Could not get all fact tables of " + cube, e);
       }
-      return cubeFacts;
-    } else {
-      return getAllFactTables(((DerivedCube) cube).getParent());
+    } catch (HiveException e) {
+      throw new HiveException("Could not get all fact tables of " + cube, e);
     }
+    return cubeFacts;
   }
 
   /**
@@ -1689,7 +1698,7 @@ public class CubeMetastoreClient {
     List<CubeDimensionTable> dimTables = new ArrayList<CubeDimensionTable>();
     try {
       for (CubeDimensionTable dimTbl : getAllDimensionTables()) {
-        if (dimTbl.getDimName().equalsIgnoreCase(dim.getName().toLowerCase())) {
+        if (dim == null || dimTbl.getDimName().equalsIgnoreCase(dim.getName().toLowerCase())) {
           dimTables.add(dimTbl);
         }
       }

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/309f62cc/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 a1022fd..6b6a09b 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
@@ -89,7 +89,7 @@ class CandidateTableResolver implements ContextRewriter {
   private void populateCandidateTables(CubeQueryContext cubeql) throws SemanticException {
     try {
       if (cubeql.getCube() != null) {
-        List<CubeFactTable> factTables = cubeql.getMetastoreClient().getAllFactTables(cubeql.getCube());
+        List<CubeFactTable> factTables = cubeql.getMetastoreClient().getAllFacts(cubeql.getCube());
         if (factTables.isEmpty()) {
           throw new SemanticException(ErrorMsg.NO_CANDIDATE_FACT_AVAILABLE, cubeql.getCube().getName()
             + " does not have any facts");

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/309f62cc/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 9ceea48..96f2b9b 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
@@ -690,7 +690,7 @@ public class TestCubeMetastoreClient {
     addedMsr = altered.getMeasureByName("testaddmsr1");
     Assert.assertNotNull(addedMsr);
     Assert.assertEquals(addedMsr.getType(), "double");
-    Assert.assertTrue(client.getAllFactTables(altered).isEmpty());
+    Assert.assertTrue(client.getAllFacts(altered).isEmpty());
   }
 
   @Test(priority = 2)
@@ -765,8 +765,8 @@ public class TestCubeMetastoreClient {
     Table cubeTbl = client.getHiveTable(factName);
     Assert.assertTrue(client.isFactTable(cubeTbl));
     Assert.assertTrue(client.isFactTableForCube(cubeTbl, CUBE_NAME));
-    Assert.assertEquals(client.getAllFactTables(client.getCube(CUBE_NAME)).get(0).getName(), factName.toLowerCase());
-    Assert.assertEquals(client.getAllFactTables(client.getCube(DERIVED_CUBE_NAME)).get(0).getName(),
+    Assert.assertEquals(client.getAllFacts(client.getCube(CUBE_NAME)).get(0).getName(), factName.toLowerCase());
+    Assert.assertEquals(client.getAllFacts(client.getCube(DERIVED_CUBE_NAME)).get(0).getName(),
       factName.toLowerCase());
     CubeFactTable cubeFact2 = new CubeFactTable(cubeTbl);
     Assert.assertTrue(cubeFact.equals(cubeFact2));
@@ -955,13 +955,13 @@ public class TestCubeMetastoreClient {
     client.dropStorageFromFact(factName, c2);
     storageTableName = MetastoreUtil.getFactStorageTableName(factName, c2);
     Assert.assertFalse(client.tableExists(storageTableName));
-    List<CubeFactTable> cubeFacts = client.getAllFactTables(client.getCube(CUBE_NAME));
+    List<CubeFactTable> cubeFacts = client.getAllFacts(client.getCube(CUBE_NAME));
     List<String> cubeFactNames = new ArrayList<String>();
     for (CubeFactTable cfact : cubeFacts) {
       cubeFactNames.add(cfact.getName());
     }
     Assert.assertTrue(cubeFactNames.contains(factName.toLowerCase()));
-    cubeFacts = client.getAllFactTables(client.getCube(DERIVED_CUBE_NAME));
+    cubeFacts = client.getAllFacts(client.getCube(DERIVED_CUBE_NAME));
     cubeFactNames = new ArrayList<String>();
     for (CubeFactTable cfact : cubeFacts) {
       cubeFactNames.add(cfact.getName());
@@ -971,7 +971,7 @@ public class TestCubeMetastoreClient {
     Assert.assertFalse(client.tableExists(MetastoreUtil.getFactStorageTableName(factName, c1)));
     Assert.assertFalse(client.tableExists(MetastoreUtil.getFactStorageTableName(factName, c3)));
     Assert.assertFalse(client.tableExists(factName));
-    cubeFacts = client.getAllFactTables(cube);
+    cubeFacts = client.getAllFacts(cube);
     cubeFactNames = new ArrayList<String>();
     for (CubeFactTable cfact : cubeFacts) {
       cubeFactNames.add(cfact.getName());

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/309f62cc/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 9de5f79..090e0d7 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
@@ -322,13 +322,15 @@ public interface CubeMetastoreService {
   void dropStorageOfDimTable(LensSessionHandle sessionid, String dimTblName, String storage) throws LensException;
 
   /**
-   * Get all dimension tables
+   * Get all dimension tables. dimensionName is an optional filter of dimension name.
+   * If provided, only the dimension tables belonging to given dimension will be returned
    *
    * @param sessionid
+   * @param dimensionName dimension name to be filtered with. Optional
    * @return
    * @throws LensException
    */
-  List<String> getAllDimTableNames(LensSessionHandle sessionid) throws LensException;
+  List<String> getAllDimTableNames(LensSessionHandle sessionid, String dimensionName) throws LensException;
 
   /**
    * Get all partitions of a dimension table in a storage
@@ -367,16 +369,6 @@ public interface CubeMetastoreService {
     XPartitionList partitions) throws LensException;
 
   /**
-   * Get all facts of cube. Cube can also be a derived cube
-   *
-   * @param sessionid The session id
-   * @param cubeName  The cube name
-   * @return List of FactTable objects
-   * @throws LensException
-   */
-  List<XFactTable> getAllFactsOfCube(LensSessionHandle sessionid, String cubeName) throws LensException;
-
-  /**
    * Get fact table given by name
    *
    * @param sessionid The sessionid
@@ -418,10 +410,11 @@ public interface CubeMetastoreService {
    * Get all fact names
    *
    * @param sessionid The sessionid
+   * @param cubeName optional filter filter facts by cube name.
    * @return List of fact table names
    * @throws LensException
    */
-  List<String> getAllFactNames(LensSessionHandle sessionid) throws LensException;
+  List<String> getAllFactNames(LensSessionHandle sessionid, String cubeName) throws LensException;
 
   /**
    * Get all storages of fact

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/309f62cc/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 0e6d057..1a2b5b5 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
@@ -416,6 +416,28 @@ public class CubeMetastoreServiceImpl extends LensService implements CubeMetasto
   }
 
   @Override
+  public List<String> getAllDimTableNames(LensSessionHandle sessionid, String dimensionName) throws LensException {
+    try {
+      acquire(sessionid);
+      CubeMetastoreClient client = getClient(sessionid);
+      Dimension dimension = client.getDimension(dimensionName);
+      if (dimensionName != null && dimension == null) {
+        throw new LensException("Could not get table: " + dimensionName + " as a dimension");
+      }
+      Collection<CubeDimensionTable> dims = client.getAllDimensionTables(dimension);
+      List<String> dimNames = new ArrayList<String>(dims.size());
+      for (CubeDimensionTable cdt : dims) {
+        dimNames.add(cdt.getName());
+      }
+      return dimNames;
+    } catch (HiveException e) {
+      throw new LensException(e);
+    } finally {
+      release(sessionid);
+    }
+  }
+
+  @Override
   public void dropAllStoragesOfFact(LensSessionHandle sessionid, String factName) throws LensException {
     try {
       acquire(sessionid);
@@ -458,27 +480,6 @@ public class CubeMetastoreServiceImpl extends LensService implements CubeMetasto
   }
 
   @Override
-  public List<XFactTable> getAllFactsOfCube(LensSessionHandle sessionid, String cubeName) throws LensException {
-    try {
-      acquire(sessionid);
-      CubeMetastoreClient msClient = getClient(sessionid);
-      List<CubeFactTable> cubeFacts = msClient.getAllFactTables(msClient.getCube(cubeName));
-      if (cubeFacts != null && !cubeFacts.isEmpty()) {
-        List<XFactTable> facts = new ArrayList<XFactTable>(cubeFacts.size());
-        for (CubeFactTable cft : cubeFacts) {
-          facts.add(JAXBUtils.factTableFromCubeFactTable(cft));
-        }
-        return facts;
-      }
-    } catch (HiveException e) {
-      throw new LensException(e);
-    } finally {
-      release(sessionid);
-    }
-    return null;
-  }
-
-  @Override
   public XFactTable getFactTable(LensSessionHandle sessionid, String fact) throws LensException {
     try {
       acquire(sessionid);
@@ -550,10 +551,15 @@ public class CubeMetastoreServiceImpl extends LensService implements CubeMetasto
   }
 
   @Override
-  public List<String> getAllFactNames(LensSessionHandle sessionid) throws LensException {
+  public List<String> getAllFactNames(LensSessionHandle sessionid, String cubeName) throws LensException {
     try {
       acquire(sessionid);
-      Collection<CubeFactTable> facts = getClient(sessionid).getAllFacts();
+      CubeMetastoreClient client = getClient(sessionid);
+      CubeInterface fact = client.getCube(cubeName);
+      if (cubeName != null && fact == null) {
+        throw new LensException("Could not get table: " + cubeName + " as a cube");
+      }
+      Collection<CubeFactTable> facts = client.getAllFacts(fact);
       List<String> factNames = new ArrayList<String>(facts.size());
       for (CubeFactTable cft : facts) {
         factNames.add(cft.getName());
@@ -566,22 +572,6 @@ public class CubeMetastoreServiceImpl extends LensService implements CubeMetasto
     }
   }
 
-  @Override
-  public List<String> getAllDimTableNames(LensSessionHandle sessionid) throws LensException {
-    try {
-      acquire(sessionid);
-      Collection<CubeDimensionTable> dims = getClient(sessionid).getAllDimensionTables();
-      List<String> dimNames = new ArrayList<String>(dims.size());
-      for (CubeDimensionTable cdt : dims) {
-        dimNames.add(cdt.getName());
-      }
-      return dimNames;
-    } catch (HiveException e) {
-      throw new LensException(e);
-    } finally {
-      release(sessionid);
-    }
-  }
 
   @Override
   public List<String> getStoragesOfFact(LensSessionHandle sessionid, String fact) throws LensException {

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/309f62cc/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 06c352e..a6178e2 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
@@ -37,6 +37,8 @@ import org.apache.log4j.Logger;
 
 import org.glassfish.jersey.media.multipart.FormDataParam;
 
+import com.google.common.collect.Lists;
+
 /**
  * metastore resource api
  * <p/>
@@ -341,9 +343,13 @@ public class MetastoreResource {
 
 
   private void checkTableNotFound(LensException e, String table) {
+    List<String> messages = Lists.newArrayList();
+    messages.add(e.getMessage());
     if (e.getCause() instanceof HiveException) {
-      HiveException hiveErr = (HiveException) e.getCause();
-      if (hiveErr.getMessage().startsWith("Could not get table")) {
+      messages.add(e.getCause().getMessage());
+    }
+    for (String message : messages) {
+      if (message.startsWith("Could not get table")) {
         throw new NotFoundException("Table not found " + table, e);
       }
     }
@@ -714,6 +720,27 @@ public class MetastoreResource {
   }
 
   /**
+   * Get all dimtables that belong to a dimension in the metastore
+   *
+   * @param sessionid The sessionid in which user is working
+   * @param dimensionName name of the dimension
+   * @return List of {@link XDimensionTable} objects
+   */
+  @GET
+  @Path("/dimensions/{dimName}/dimtables")
+  public StringList getAllDimensionTablesOfDimension(
+    @QueryParam("sessionid") LensSessionHandle sessionid, @PathParam("dimName") String dimensionName)
+    throws LensException {
+    checkSessionId(sessionid);
+    try {
+      return new StringList(getSvc().getAllDimTableNames(sessionid, dimensionName));
+    } catch (LensException exc) {
+      checkTableNotFound(exc, dimensionName);
+      throw exc;
+    }
+  }
+
+  /**
    * Get all facts that belong to a cube in the metastore
    *
    * @param sessionid The sessionid in which user is working
@@ -722,12 +749,12 @@ public class MetastoreResource {
    */
   @GET
   @Path("/cubes/{cubeName}/facts")
-  public List<XFactTable> getAllFactsOfCube(
+  public StringList getAllFactsOfCube(
     @QueryParam("sessionid") LensSessionHandle sessionid, @PathParam("cubeName") String cubeName)
     throws LensException {
     checkSessionId(sessionid);
     try {
-      return getSvc().getAllFactsOfCube(sessionid, cubeName);
+      return new StringList(getSvc().getAllFactNames(sessionid, cubeName));
     } catch (LensException exc) {
       checkTableNotFound(exc, cubeName);
       throw exc;
@@ -744,7 +771,7 @@ public class MetastoreResource {
   @Path("/facts")
   public StringList getAllFacts(@QueryParam("sessionid") LensSessionHandle sessionid) throws LensException {
     checkSessionId(sessionid);
-    return new StringList(getSvc().getAllFactNames(sessionid));
+    return new StringList(getSvc().getAllFactNames(sessionid, null));
   }
 
   /**
@@ -1147,7 +1174,7 @@ public class MetastoreResource {
   @GET
   @Path("/dimtables")
   public StringList getAllDims(@QueryParam("sessionid") LensSessionHandle sessionid) throws LensException {
-    return new StringList(getSvc().getAllDimTableNames(sessionid));
+    return new StringList(getSvc().getAllDimTableNames(sessionid, null));
   }
 
   /**