minor, add project to cube list api
Project: http://git-wip-us.apache.org/repos/asf/kylin/repo Commit: http://git-wip-us.apache.org/repos/asf/kylin/commit/9a51ed87 Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/9a51ed87 Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/9a51ed87 Branch: refs/heads/2.2.x Commit: 9a51ed87074e996574d2d05b39044371198f4d91 Parents: d20e1d0 Author: lidongsjtu <lid...@apache.org> Authored: Tue Oct 17 15:21:55 2017 +0800 Committer: lidongsjtu <lid...@apache.org> Committed: Tue Oct 17 15:38:05 2017 +0800 ---------------------------------------------------------------------- .../kylin/rest/controller/CubeController.java | 28 +++++++++++++------- .../apache/kylin/rest/service/CubeService.java | 27 ++++++++++++++++++- .../rest/controller/AccessControllerTest.java | 23 +++++++++------- .../rest/controller/CubeControllerTest.java | 10 +++---- 4 files changed, 62 insertions(+), 26 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/kylin/blob/9a51ed87/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 b6ec0e2..c3b6e45 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 @@ -52,6 +52,7 @@ import org.apache.kylin.rest.exception.NotFoundException; import org.apache.kylin.rest.request.CubeRequest; import org.apache.kylin.rest.request.JobBuildRequest; import org.apache.kylin.rest.request.JobBuildRequest2; +import org.apache.kylin.rest.response.CubeInstanceResponse; import org.apache.kylin.rest.response.EnvelopeResponse; import org.apache.kylin.rest.response.GeneralResponse; import org.apache.kylin.rest.response.HBaseResponse; @@ -109,26 +110,34 @@ public class CubeController extends BasicController { @RequestMapping(value = "", method = { RequestMethod.GET }, produces = { "application/json" }) @ResponseBody - public List<CubeInstance> getCubes(@RequestParam(value = "cubeName", required = false) String cubeName, + public List<CubeInstanceResponse> 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, true); + List<CubeInstance> cubes = cubeService.listAllCubes(cubeName, projectName, modelName, true); - int climit = (null == limit) ? cubes.size() : limit; + List<CubeInstanceResponse> response = Lists.newArrayListWithExpectedSize(cubes.size()); + for (CubeInstance cube : cubes) { + try { + response.add(cubeService.createCubeInstanceResponse(cube)); + } catch (Exception e) { + logger.error("Error creating cube instance response, skipping.", e); + } + } + + int climit = (null == limit) ? response.size() : limit; int coffset = (null == offset) ? 0 : offset; - if (cubes.size() <= coffset) { + if (response.size() <= coffset) { return Collections.emptyList(); } - if ((cubes.size() - coffset) < climit) { - return cubes.subList(coffset, cubes.size()); + if ((response.size() - coffset) < climit) { + return response.subList(coffset, response.size()); } - return cubes.subList(coffset, coffset + climit); + return response.subList(coffset, coffset + climit); } @RequestMapping(value = "validEncodings", method = { RequestMethod.GET }, produces = { "application/json" }) @@ -280,7 +289,7 @@ public class CubeController extends BasicController { @RequestMapping(value = "/{cubeName}/rebuild", method = { RequestMethod.PUT }, produces = { "application/json" }) @ResponseBody public JobInstance rebuild(@PathVariable String cubeName, @RequestBody JobBuildRequest req) { - return buildInternal(cubeName, new TSRange(req.getStartTime(), req.getEndTime()), null, null, null, + return buildInternal(cubeName, new TSRange(req.getStartTime(), req.getEndTime()), null, null, null, req.getBuildType(), req.isForce() || req.isForceMergeEmptySegment()); } @@ -746,5 +755,4 @@ public class CubeController extends BasicController { public void setJobService(JobService jobService) { this.jobService = jobService; } - } http://git-wip-us.apache.org/repos/asf/kylin/blob/9a51ed87/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 28859b6..299540f 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 @@ -42,6 +42,7 @@ import org.apache.kylin.job.execution.ExecutableState; import org.apache.kylin.metadata.cachesync.Broadcaster; import org.apache.kylin.metadata.draft.Draft; import org.apache.kylin.metadata.model.DataModelDesc; +import org.apache.kylin.metadata.model.ISourceAware; import org.apache.kylin.metadata.model.SegmentRange; import org.apache.kylin.metadata.model.SegmentStatusEnum; import org.apache.kylin.metadata.project.ProjectInstance; @@ -55,6 +56,7 @@ import org.apache.kylin.rest.exception.ForbiddenException; import org.apache.kylin.rest.msg.Message; import org.apache.kylin.rest.msg.MsgPicker; import org.apache.kylin.rest.request.MetricsRequest; +import org.apache.kylin.rest.response.CubeInstanceResponse; import org.apache.kylin.rest.response.HBaseResponse; import org.apache.kylin.rest.response.MetricsResponse; import org.apache.kylin.rest.security.AclPermission; @@ -69,6 +71,7 @@ import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Component; +import com.google.common.base.Preconditions; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import com.google.common.collect.Lists; @@ -446,7 +449,7 @@ public class CubeService extends BasicService implements InitializingBean { if ("hbase".equals(getConfig().getMetadataUrl().getScheme())) { try { logger.debug("Loading HTable info " + cubeName + ", " + tableName); - + // use reflection to isolate NoClassDef errors when HBase is not available hr = (HBaseResponse) Class.forName("org.apache.kylin.rest.service.HBaseInfoUtil")// .getMethod("getHBaseInfo", new Class[] { String.class, KylinConfig.class })// @@ -460,6 +463,28 @@ public class CubeService extends BasicService implements InitializingBean { return hr; } + public CubeInstanceResponse createCubeInstanceResponse(CubeInstance cube) { + Preconditions.checkState(!cube.getDescriptor().isDraft()); + + CubeInstanceResponse r = new CubeInstanceResponse(cube); + + CubeDesc cubeDesc = cube.getDescriptor(); + DataModelDesc modelDesc = cubeDesc.getModel(); + r.setModel(cubeDesc.getModelName()); + r.setLastModified(cubeDesc.getLastModified()); + r.setPartitionDateStart(cubeDesc.getPartitionDateStart()); + // cuz model doesn't have a state the label a model is broken, + // so in some case the model can not be loaded due to some check failed, + // but the cube in this model can still be loaded. + if (modelDesc != null) { + r.setPartitionDateColumn(modelDesc.getPartitionDesc().getPartitionDateColumn()); + r.setIs_streaming(modelDesc.getRootFactTable().getTableDesc().getSourceType() == ISourceAware.ID_STREAMING); + } + r.setProject(cube.getProject()); + + return r; + } + public void updateCubeNotifyList(CubeInstance cube, List<String> notifyList) throws IOException { aclEvaluate.hasProjectOperationPermission(cube.getProjectInstance()); CubeDesc desc = cube.getDescriptor(); http://git-wip-us.apache.org/repos/asf/kylin/blob/9a51ed87/server/src/test/java/org/apache/kylin/rest/controller/AccessControllerTest.java ---------------------------------------------------------------------- diff --git a/server/src/test/java/org/apache/kylin/rest/controller/AccessControllerTest.java b/server/src/test/java/org/apache/kylin/rest/controller/AccessControllerTest.java index 1040a84..076c080 100644 --- a/server/src/test/java/org/apache/kylin/rest/controller/AccessControllerTest.java +++ b/server/src/test/java/org/apache/kylin/rest/controller/AccessControllerTest.java @@ -18,10 +18,18 @@ package org.apache.kylin.rest.controller; +import static junit.framework.TestCase.fail; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.io.IOException; +import java.util.List; + import org.apache.kylin.cube.CubeInstance; import org.apache.kylin.metadata.project.ProjectInstance; import org.apache.kylin.rest.request.AccessRequest; import org.apache.kylin.rest.response.AccessEntryResponse; +import org.apache.kylin.rest.response.CubeInstanceResponse; import org.apache.kylin.rest.security.AclEntityType; import org.apache.kylin.rest.security.AclPermissionType; import org.apache.kylin.rest.service.AccessService; @@ -38,13 +46,6 @@ import org.springframework.security.authentication.TestingAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; -import java.io.IOException; -import java.util.List; - -import static junit.framework.TestCase.fail; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - /** * @author xduo */ @@ -88,7 +89,8 @@ public class AccessControllerTest extends ServiceTestBase implements AclEntityTy @Test public void testBasics() throws IOException { swichToAdmin(); - List<AccessEntryResponse> aes = accessController.getAccessEntities(CUBE_INSTANCE, "a24ca905-1fc6-4f67-985c-38fa5aeafd92"); + List<AccessEntryResponse> aes = accessController.getAccessEntities(CUBE_INSTANCE, + "a24ca905-1fc6-4f67-985c-38fa5aeafd92"); Assert.assertTrue(aes.size() == 0); AccessRequest accessRequest = getAccessRequest(MODELER, ADMINISTRATION); @@ -151,7 +153,7 @@ public class AccessControllerTest extends ServiceTestBase implements AclEntityTy @Test public void testAuthInCubeLevel() throws Exception { swichToAdmin(); - List<CubeInstance> cubes = cubeController.getCubes(null, null, null, 100000, 0); + List<CubeInstanceResponse> cubes = cubeController.getCubes(null, null, null, 100000, 0); assertTrue(cubes.size() > 0); CubeInstance cube = cubes.get(0); swichToAnalyst(); @@ -173,7 +175,8 @@ public class AccessControllerTest extends ServiceTestBase implements AclEntityTy } swichToAdmin(); List<ProjectInstance> projects = projectController.getProjects(10000, 0); - List<AccessEntryResponse> aes = accessController.grant(PROJECT_INSTANCE, projects.get(0).getUuid(), accessRequest); + List<AccessEntryResponse> aes = accessController.grant(PROJECT_INSTANCE, projects.get(0).getUuid(), + accessRequest); Assert.assertTrue(aes.size() == 1); swichToAnalyst(); cubes = cubeController.getCubes(null, null, "default", 100000, 0); http://git-wip-us.apache.org/repos/asf/kylin/blob/9a51ed87/server/src/test/java/org/apache/kylin/rest/controller/CubeControllerTest.java ---------------------------------------------------------------------- diff --git a/server/src/test/java/org/apache/kylin/rest/controller/CubeControllerTest.java b/server/src/test/java/org/apache/kylin/rest/controller/CubeControllerTest.java index 2c91d90..950f0b4 100644 --- a/server/src/test/java/org/apache/kylin/rest/controller/CubeControllerTest.java +++ b/server/src/test/java/org/apache/kylin/rest/controller/CubeControllerTest.java @@ -28,6 +28,7 @@ import org.apache.kylin.cube.model.CubeDesc; import org.apache.kylin.metadata.model.SegmentRange.TSRange; import org.apache.kylin.rest.exception.InternalErrorException; import org.apache.kylin.rest.request.CubeRequest; +import org.apache.kylin.rest.response.CubeInstanceResponse; import org.apache.kylin.rest.service.CubeService; import org.apache.kylin.rest.service.JobService; import org.apache.kylin.rest.service.ServiceTestBase; @@ -120,7 +121,8 @@ public class CubeControllerTest extends ServiceTestBase { cubeController.updateNotifyList(newCubeName, notifyList); cubeController.updateCubeCost(newCubeName, 80); - List<CubeInstance> cubeInstances = cubeController.getCubes(newCubeName, cube.getModelName(), "default", 1, 0); + List<CubeInstanceResponse> cubeInstances = cubeController.getCubes(newCubeName, cube.getModelName(), "default", + 1, 0); CubeInstance cubeInstance = cubeInstances.get(0); Assert.assertTrue(cubeInstance.getDescriptor().getNotifyList().contains("j...@example.com")); @@ -170,7 +172,6 @@ public class CubeControllerTest extends ServiceTestBase { Assert.assertTrue(segNumber == newSegNumber + 1); } - @Test public void testGetHoles() throws IOException { String cubeName = "test_kylin_cube_with_slr_ready_3_segments"; @@ -180,7 +181,7 @@ public class CubeControllerTest extends ServiceTestBase { CubeInstance cube = cubeService.getCubeManager().getCube(cubeName); List<CubeSegment> segments = cube.getSegments(); - final long dateEnd = segments.get(segments.size() -1).getTSRange().end.v; + final long dateEnd = segments.get(segments.size() - 1).getTSRange().end.v; final long ONEDAY = 24 * 60 * 60000; cubeService.getCubeManager().appendSegment(cube, new TSRange(dateEnd + ONEDAY, dateEnd + ONEDAY * 2)); @@ -194,10 +195,9 @@ public class CubeControllerTest extends ServiceTestBase { Assert.assertTrue(hole.getTSRange().equals(new TSRange(dateEnd, dateEnd + ONEDAY))); } - @Test public void testGetCubes() { - List<CubeInstance> cubes = cubeController.getCubes(null, null, null, 1, 0); + List<CubeInstanceResponse> cubes = cubeController.getCubes(null, null, null, 1, 0); Assert.assertTrue(cubes.size() == 1); }