#1173 refine Cube and Model search API provide both exact-match and fuzzy search API for Cube and Model
Project: http://git-wip-us.apache.org/repos/asf/kylin/repo Commit: http://git-wip-us.apache.org/repos/asf/kylin/commit/f32165ef Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/f32165ef Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/f32165ef Branch: refs/heads/master Commit: f32165ef3c89ed6a6004a63d28f7227e6cd6d1e6 Parents: 56e9fb9 Author: Roger Shi <rogershijich...@hotmail.com> Authored: Thu Jun 15 20:56:07 2017 +0800 Committer: Hongbin Ma <m...@kyligence.io> Committed: Thu Jun 15 21:16:29 2017 +0800 ---------------------------------------------------------------------- .../apache/kylin/rest/controller/CubeController.java | 2 +- .../kylin/rest/controller2/CubeControllerV2.java | 3 ++- .../kylin/rest/controller2/ModelControllerV2.java | 3 ++- .../org/apache/kylin/rest/service/CubeService.java | 5 +++-- .../org/apache/kylin/rest/service/ModelService.java | 15 ++++++++------- .../org/apache/kylin/rest/service/QueryService.java | 2 +- .../apache/kylin/rest/service/CubeServiceTest.java | 2 +- .../apache/kylin/rest/service/ModelServiceTest.java | 6 +++--- 8 files changed, 21 insertions(+), 17 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/kylin/blob/f32165ef/server-base/src/main/java/org/apache/kylin/rest/controller/CubeController.java ---------------------------------------------------------------------- diff --git a/server-base/src/main/java/org/apache/kylin/rest/controller/CubeController.java b/server-base/src/main/java/org/apache/kylin/rest/controller/CubeController.java index bfa5603..14c80a0 100644 --- a/server-base/src/main/java/org/apache/kylin/rest/controller/CubeController.java +++ b/server-base/src/main/java/org/apache/kylin/rest/controller/CubeController.java @@ -101,7 +101,7 @@ public class CubeController extends BasicController { @ResponseBody public List<CubeInstance> getCubes(@RequestParam(value = "cubeName", required = false) String cubeName, @RequestParam(value = "modelName", required = false) String modelName, @RequestParam(value = "projectName", required = false) String projectName, @RequestParam(value = "limit", required = false) Integer limit, @RequestParam(value = "offset", required = false) Integer offset) { List<CubeInstance> cubes; - cubes = cubeService.listAllCubes(cubeName, projectName, modelName); + cubes = cubeService.listAllCubes(cubeName, projectName, modelName, true); int climit = (null == limit) ? cubes.size() : limit; int coffset = (null == offset) ? 0 : offset; http://git-wip-us.apache.org/repos/asf/kylin/blob/f32165ef/server-base/src/main/java/org/apache/kylin/rest/controller2/CubeControllerV2.java ---------------------------------------------------------------------- diff --git a/server-base/src/main/java/org/apache/kylin/rest/controller2/CubeControllerV2.java b/server-base/src/main/java/org/apache/kylin/rest/controller2/CubeControllerV2.java index 309fffc..720cf76 100644 --- a/server-base/src/main/java/org/apache/kylin/rest/controller2/CubeControllerV2.java +++ b/server-base/src/main/java/org/apache/kylin/rest/controller2/CubeControllerV2.java @@ -102,6 +102,7 @@ public class CubeControllerV2 extends BasicController { @RequestMapping(value = "", method = { RequestMethod.GET }, produces = { "application/vnd.apache.kylin-v2+json" }) @ResponseBody public EnvelopeResponse getCubesPaging(@RequestParam(value = "cubeName", required = false) String cubeName, + @RequestParam(value = "exactMatch", required = false, defaultValue = "true") boolean exactMatch, @RequestParam(value = "modelName", required = false) String modelName, @RequestParam(value = "projectName", required = false) String projectName, @RequestParam(value = "pageOffset", required = false, defaultValue = "0") Integer pageOffset, @@ -109,7 +110,7 @@ public class CubeControllerV2 extends BasicController { HashMap<String, Object> data = new HashMap<String, Object>(); List<CubeInstanceResponse> response = new ArrayList<CubeInstanceResponse>(); - List<CubeInstance> cubes = cubeService.listAllCubes(cubeName, projectName, modelName); + List<CubeInstance> cubes = cubeService.listAllCubes(cubeName, projectName, modelName, exactMatch); // official cubes for (CubeInstance cube : cubes) { http://git-wip-us.apache.org/repos/asf/kylin/blob/f32165ef/server-base/src/main/java/org/apache/kylin/rest/controller2/ModelControllerV2.java ---------------------------------------------------------------------- diff --git a/server-base/src/main/java/org/apache/kylin/rest/controller2/ModelControllerV2.java b/server-base/src/main/java/org/apache/kylin/rest/controller2/ModelControllerV2.java index e775c9c..58f6bee 100644 --- a/server-base/src/main/java/org/apache/kylin/rest/controller2/ModelControllerV2.java +++ b/server-base/src/main/java/org/apache/kylin/rest/controller2/ModelControllerV2.java @@ -92,6 +92,7 @@ public class ModelControllerV2 extends BasicController { @RequestMapping(value = "", method = { RequestMethod.GET }, produces = { "application/vnd.apache.kylin-v2+json" }) @ResponseBody public EnvelopeResponse getModelsPaging(@RequestParam(value = "modelName", required = false) String modelName, + @RequestParam(value = "exactMatch", required = false, defaultValue = "true") boolean exactMatch, @RequestParam(value = "projectName", required = false) String projectName, @RequestParam(value = "pageOffset", required = false, defaultValue = "0") Integer pageOffset, @RequestParam(value = "pageSize", required = false, defaultValue = "10") Integer pageSize) @@ -100,7 +101,7 @@ public class ModelControllerV2 extends BasicController { List<DataModelDescResponse> response = new ArrayList<DataModelDescResponse>(); // official models - for (DataModelDesc m : modelService.listAllModels(modelName, projectName)) { + for (DataModelDesc m : modelService.listAllModels(modelName, projectName, exactMatch)) { Preconditions.checkState(!m.isDraft()); DataModelDescResponse r = new DataModelDescResponse(m); http://git-wip-us.apache.org/repos/asf/kylin/blob/f32165ef/server-base/src/main/java/org/apache/kylin/rest/service/CubeService.java ---------------------------------------------------------------------- diff --git a/server-base/src/main/java/org/apache/kylin/rest/service/CubeService.java b/server-base/src/main/java/org/apache/kylin/rest/service/CubeService.java index 4a03e05..74d8578 100644 --- a/server-base/src/main/java/org/apache/kylin/rest/service/CubeService.java +++ b/server-base/src/main/java/org/apache/kylin/rest/service/CubeService.java @@ -97,7 +97,7 @@ public class CubeService extends BasicService { private ModelService modelService; @PostFilter(Constant.ACCESS_POST_FILTER_READ) - public List<CubeInstance> listAllCubes(final String cubeName, final String projectName, final String modelName) { + public List<CubeInstance> listAllCubes(final String cubeName, final String projectName, final String modelName, boolean exactMatch) { List<CubeInstance> cubeInstances = null; ProjectInstance project = (null != projectName) ? getProjectManager().getProject(projectName) : null; @@ -124,7 +124,8 @@ public class CubeService extends BasicService { List<CubeInstance> filterCubes = new ArrayList<CubeInstance>(); for (CubeInstance cubeInstance : filterModelCubes) { boolean isCubeMatch = (null == cubeName) - || cubeInstance.getName().toLowerCase().contains(cubeName.toLowerCase()); + || (!exactMatch && cubeInstance.getName().toLowerCase().contains(cubeName.toLowerCase())) || + (exactMatch && cubeInstance.getName().toLowerCase().equals(cubeName.toLowerCase())); if (isCubeMatch) { filterCubes.add(cubeInstance); http://git-wip-us.apache.org/repos/asf/kylin/blob/f32165ef/server-base/src/main/java/org/apache/kylin/rest/service/ModelService.java ---------------------------------------------------------------------- diff --git a/server-base/src/main/java/org/apache/kylin/rest/service/ModelService.java b/server-base/src/main/java/org/apache/kylin/rest/service/ModelService.java index 14ee65a..fa54eaa 100644 --- a/server-base/src/main/java/org/apache/kylin/rest/service/ModelService.java +++ b/server-base/src/main/java/org/apache/kylin/rest/service/ModelService.java @@ -73,7 +73,7 @@ public class ModelService extends BasicService { private CubeService cubeService; @PostFilter(Constant.ACCESS_POST_FILTER_READ) - public List<DataModelDesc> listAllModels(final String modelName, final String projectName) throws IOException { + public List<DataModelDesc> listAllModels(final String modelName, final String projectName, boolean exactMatch) throws IOException { List<DataModelDesc> models; ProjectInstance project = (null != projectName) ? getProjectManager().getProject(projectName) : null; @@ -86,7 +86,8 @@ public class ModelService extends BasicService { List<DataModelDesc> filterModels = new ArrayList<DataModelDesc>(); for (DataModelDesc modelDesc : models) { boolean isModelMatch = (null == modelName) || modelName.length() == 0 - || modelDesc.getName().toLowerCase().equals(modelName.toLowerCase()); + || (exactMatch && modelDesc.getName().toLowerCase().equals(modelName.toLowerCase())) + || (!exactMatch && modelDesc.getName().toLowerCase().contains(modelName.toLowerCase())); if (isModelMatch) { filterModels.add(modelDesc); @@ -99,7 +100,7 @@ public class ModelService extends BasicService { public List<DataModelDesc> getModels(final String modelName, final String projectName, final Integer limit, final Integer offset) throws IOException { - List<DataModelDesc> modelDescs = listAllModels(modelName, projectName); + List<DataModelDesc> modelDescs = listAllModels(modelName, projectName, true); if (limit == null || offset == null) { return modelDescs; @@ -182,7 +183,7 @@ public class ModelService extends BasicService { public Map<TblColRef, Set<CubeInstance>> getUsedDimCols(String modelName) { Map<TblColRef, Set<CubeInstance>> ret = Maps.newHashMap(); - List<CubeInstance> cubeInstances = cubeService.listAllCubes(null, null, modelName); + List<CubeInstance> cubeInstances = cubeService.listAllCubes(null, null, modelName, true); for (CubeInstance cubeInstance : cubeInstances) { CubeDesc cubeDesc = cubeInstance.getDescriptor(); for (TblColRef tblColRef : cubeDesc.listDimensionColumnsIncludingDerived()) { @@ -199,7 +200,7 @@ public class ModelService extends BasicService { public Map<TblColRef, Set<CubeInstance>> getUsedNonDimCols(String modelName) { Map<TblColRef, Set<CubeInstance>> ret = Maps.newHashMap(); - List<CubeInstance> cubeInstances = cubeService.listAllCubes(null, null, modelName); + List<CubeInstance> cubeInstances = cubeService.listAllCubes(null, null, modelName, true); for (CubeInstance cubeInstance : cubeInstances) { CubeDesc cubeDesc = cubeInstance.getDescriptor(); Set<TblColRef> tblColRefs = Sets.newHashSet(cubeDesc.listAllColumns());//make a copy @@ -218,7 +219,7 @@ public class ModelService extends BasicService { private boolean validateUpdatingModel(DataModelDesc dataModelDesc) throws IOException { String modelName = dataModelDesc.getName(); - List<CubeInstance> cubes = cubeService.listAllCubes(null, null, modelName); + List<CubeInstance> cubes = cubeService.listAllCubes(null, null, modelName, true); if (cubes != null && cubes.size() != 0) { dataModelDesc.init(getConfig(), getMetadataManager().getAllTablesMap(), getMetadataManager().getCcInfoMap()); @@ -255,7 +256,7 @@ public class ModelService extends BasicService { return false; } - DataModelDesc originDataModelDesc = listAllModels(modelName, null).get(0); + DataModelDesc originDataModelDesc = listAllModels(modelName, null, true).get(0); if (!dataModelDesc.getRootFactTable().equals(originDataModelDesc.getRootFactTable())) return false; http://git-wip-us.apache.org/repos/asf/kylin/blob/f32165ef/server-base/src/main/java/org/apache/kylin/rest/service/QueryService.java ---------------------------------------------------------------------- diff --git a/server-base/src/main/java/org/apache/kylin/rest/service/QueryService.java b/server-base/src/main/java/org/apache/kylin/rest/service/QueryService.java index 1b118a3..bf32140 100644 --- a/server-base/src/main/java/org/apache/kylin/rest/service/QueryService.java +++ b/server-base/src/main/java/org/apache/kylin/rest/service/QueryService.java @@ -610,7 +610,7 @@ public class QueryService extends BasicService { ProjectInstance projectInstance = getProjectManager().getProject(project); for (String modelName : projectInstance.getModels()) { - DataModelDesc dataModelDesc = modelService.listAllModels(modelName, project).get(0); + DataModelDesc dataModelDesc = modelService.listAllModels(modelName, project, true).get(0); if (!dataModelDesc.isDraft()) { // update table type: FACT http://git-wip-us.apache.org/repos/asf/kylin/blob/f32165ef/server/src/test/java/org/apache/kylin/rest/service/CubeServiceTest.java ---------------------------------------------------------------------- diff --git a/server/src/test/java/org/apache/kylin/rest/service/CubeServiceTest.java b/server/src/test/java/org/apache/kylin/rest/service/CubeServiceTest.java index a190d6d..96146ef 100644 --- a/server/src/test/java/org/apache/kylin/rest/service/CubeServiceTest.java +++ b/server/src/test/java/org/apache/kylin/rest/service/CubeServiceTest.java @@ -51,7 +51,7 @@ public class CubeServiceTest extends ServiceTestBase { Assert.assertNotNull(cubeService.getMetadataManager()); Assert.assertNotNull(cacheService.getOLAPDataSource(ProjectInstance.DEFAULT_PROJECT_NAME)); - List<CubeInstance> cubes = cubeService.listAllCubes(null, null, null); + List<CubeInstance> cubes = cubeService.listAllCubes(null, null, null, true); Assert.assertNotNull(cubes); CubeInstance cube = cubes.get(0); } http://git-wip-us.apache.org/repos/asf/kylin/blob/f32165ef/server/src/test/java/org/apache/kylin/rest/service/ModelServiceTest.java ---------------------------------------------------------------------- diff --git a/server/src/test/java/org/apache/kylin/rest/service/ModelServiceTest.java b/server/src/test/java/org/apache/kylin/rest/service/ModelServiceTest.java index 2012a05..b78b18e 100644 --- a/server/src/test/java/org/apache/kylin/rest/service/ModelServiceTest.java +++ b/server/src/test/java/org/apache/kylin/rest/service/ModelServiceTest.java @@ -48,7 +48,7 @@ public class ModelServiceTest extends ServiceTestBase { @Test public void testSuccessModelUpdate() throws IOException, JobException { - List<DataModelDesc> dataModelDescs = modelService.listAllModels("ci_inner_join_model", "default"); + List<DataModelDesc> dataModelDescs = modelService.listAllModels("ci_inner_join_model", "default", true); Assert.assertTrue(dataModelDescs.size() == 1); ByteArrayOutputStream baos = new ByteArrayOutputStream(); @@ -64,7 +64,7 @@ public class ModelServiceTest extends ServiceTestBase { @Test public void testSuccessModelUpdateOnComputedColumn() throws IOException, JobException, NoSuchFieldException, IllegalAccessException { - List<DataModelDesc> dataModelDescs = modelService.listAllModels("ci_left_join_model", "default"); + List<DataModelDesc> dataModelDescs = modelService.listAllModels("ci_left_join_model", "default", true); Assert.assertTrue(dataModelDescs.size() == 1); ByteArrayOutputStream baos = new ByteArrayOutputStream(); @@ -83,7 +83,7 @@ public class ModelServiceTest extends ServiceTestBase { expectedEx.expect(IllegalStateException.class); expectedEx.expectMessage("Computed column named DEFAULT.TEST_KYLIN_FACT.DEAL_AMOUNT is already defined in other models: [DataModelDesc [name=ci_left_join_model], DataModelDesc [name=ci_inner_join_model]]. Please change another name, or try to keep consistent definition"); - List<DataModelDesc> dataModelDescs = modelService.listAllModels("ci_left_join_model", "default"); + List<DataModelDesc> dataModelDescs = modelService.listAllModels("ci_left_join_model", "default", true); Assert.assertTrue(dataModelDescs.size() == 1); ByteArrayOutputStream baos = new ByteArrayOutputStream();