diff --git a/web/app/controllers/api/v1/Search.java b/web/app/controllers/api/v1/Search.java index b132ff9b97..6d48ec0e86 100644 --- a/web/app/controllers/api/v1/Search.java +++ b/web/app/controllers/api/v1/Search.java @@ -102,6 +102,10 @@ public class Search extends Controller { result.set("result", SearchDAO.getPagedFlowByKeyword(keyword, page, size)); } + else if (category.toLowerCase().equalsIgnoreCase("job")) + { + result.set("result", SearchDAO.getPagedJobByKeyword(keyword, page, size)); + } else if (category.toLowerCase().equalsIgnoreCase("comments")) { result.set("result", SearchDAO.getPagedCommentsByKeyword(keyword, page, size)); diff --git a/web/app/dao/FlowRowMapper.java b/web/app/dao/FlowRowMapper.java index 7b8859f7ea..360f04c16f 100644 --- a/web/app/dao/FlowRowMapper.java +++ b/web/app/dao/FlowRowMapper.java @@ -22,6 +22,10 @@ import java.sql.SQLException; public class FlowRowMapper implements RowMapper { public static String FLOW_ID_COLUMN = "flow_id"; + public static String JOB_ID_COLUMN = "job_id"; + public static String JOB_NAME_COLUMN = "job_name"; + public static String JOB_PATH_COLUMN = "job_path"; + public static String JOB_TYPE_COLUMN = "job_type"; public static String FLOW_NAME_COLUMN = "flow_name"; public static String APP_CODE_COLUMN = "app_code"; public static String APP_ID_COLUMN = "app_id"; diff --git a/web/app/dao/SearchDAO.java b/web/app/dao/SearchDAO.java index 7e1687700f..902c3cb834 100644 --- a/web/app/dao/SearchDAO.java +++ b/web/app/dao/SearchDAO.java @@ -82,6 +82,20 @@ public class SearchDAO extends AbstractMySQLOpenSourceDAO "JOIN cfg_application a on f.app_id = a.app_id ORDER BY " + "rank DESC, flow_name, app_id, flow_id, flow_group, flow_path LIMIT ?, ?"; + public final static String SEARCH_JOB_WITH_PAGINATION = "SELECT SQL_CALC_FOUND_ROWS " + + "a.app_code, f.flow_name, f.flow_group, f.flow_path, f.flow_level, " + + "j.app_id, j.flow_id, j.job_id, j.job_name, j.job_path, j.job_type, " + + "rank_01+rank_02+rank_03+rank_04 as rank " + + "FROM (SELECT app_id, flow_id, job_id, job_name, job_path, job_type, " + + "CASE WHEN job_name = '$keyword' THEN 3000 ELSE 0 END rank_01, " + + "CASE WHEN job_name like '%$keyword' THEN 2000 ELSE 0 END rank_02, " + + "CASE WHEN job_name like '$keyword%' THEN 1000 ELSE 0 END rank_03, " + + "CASE WHEN job_name like '%$keyword%' THEN 100 ELSE 0 END rank_04 " + + "FROM flow_job WHERE job_name like '%$keyword%' ) j " + + "JOIN cfg_application a on a.app_id = j.app_id " + + "JOIN flow f on f.app_id = j.app_id AND f.flow_id = j.flow_id " + + "ORDER BY rank DESC, j.job_name, j.app_id, j.flow_id, j.job_id, j.job_path LIMIT ?, ?"; + public final static String SEARCH_METRIC_WITH_PAGINATION = "SELECT SQL_CALC_FOUND_ROWS " + "metric_id, `metric_name`, `metric_description`, `dashboard_name`, `metric_ref_id_type`, " + "`metric_ref_id`, `metric_category`, `metric_group`, " + @@ -138,9 +152,11 @@ public class SearchDAO extends AbstractMySQLOpenSourceDAO { //List metricList = getJdbcTemplate().queryForList(GET_METRIC_AUTO_COMPLETE_LIST, String.class); List flowList = getJdbcTemplate().queryForList(GET_FLOW_AUTO_COMPLETE_LIST, String.class); + List jobList = getJdbcTemplate().queryForList(GET_JOB_AUTO_COMPLETE_LIST, String.class); List datasetList = getJdbcTemplate().queryForList(GET_DATASET_AUTO_COMPLETE_LIST, String.class); List autoCompleteList = - Stream.concat(flowList.stream(), datasetList.stream()).collect(Collectors.toList()); + Stream.concat(datasetList.stream(), + Stream.concat(flowList.stream(), jobList.stream())).collect(Collectors.toList()); Collections.sort(autoCompleteList); return autoCompleteList; @@ -287,7 +303,7 @@ public class SearchDAO extends AbstractMySQLOpenSourceDAO public static ObjectNode getPagedFlowByKeyword(String keyword, int page, int size) { - final List pagedFlows = new ArrayList(); + final List pagedFlows = new ArrayList(); final JdbcTemplate jdbcTemplate = getJdbcTemplate(); javax.sql.DataSource ds = jdbcTemplate.getDataSource(); DataSourceTransactionManager tm = new DataSourceTransactionManager(ds); @@ -305,15 +321,17 @@ public class SearchDAO extends AbstractMySQLOpenSourceDAO rows = jdbcTemplate.queryForList(query, (page-1)*size, size); for (Map row : rows) { - Flow flow = new Flow(); - flow.id = (Long)row.get(FlowRowMapper.FLOW_ID_COLUMN); - flow.name = (String)row.get(FlowRowMapper.FLOW_NAME_COLUMN); - flow.path = (String)row.get(FlowRowMapper.FLOW_PATH_COLUMN); - flow.group = (String)row.get(FlowRowMapper.FLOW_GROUP_COLUMN); - flow.level = (Integer)row.get(FlowRowMapper.FLOW_LEVEL_COLUMN); + FlowJob flow = new FlowJob(); + flow.flowId = (Long)row.get(FlowRowMapper.FLOW_ID_COLUMN); + flow.flowName = (String)row.get(FlowRowMapper.FLOW_NAME_COLUMN); + flow.flowPath = (String)row.get(FlowRowMapper.FLOW_PATH_COLUMN); + flow.flowGroup = (String)row.get(FlowRowMapper.FLOW_GROUP_COLUMN); flow.appCode = (String)row.get(FlowRowMapper.APP_CODE_COLUMN); flow.appId = (Integer)row.get(FlowRowMapper.APP_ID_COLUMN); - + flow.displayName = flow.flowName; + flow.link = "#/flows/" + flow.appCode + "/" + + flow.flowGroup + "/" + Long.toString(flow.flowId) + "/page/1"; + flow.path = flow.appCode + "/" + flow.flowPath; pagedFlows.add(flow); } long count = 0; @@ -329,7 +347,7 @@ public class SearchDAO extends AbstractMySQLOpenSourceDAO ObjectNode resultNode = Json.newObject(); resultNode.put("count", count); - resultNode.put("isFlow", true); + resultNode.put("isFlowJob", true); resultNode.put("page", page); resultNode.put("itemsPerPage", size); resultNode.put("totalPages", (int)Math.ceil(count/((double)size))); @@ -342,6 +360,70 @@ public class SearchDAO extends AbstractMySQLOpenSourceDAO return result; } + public static ObjectNode getPagedJobByKeyword(String keyword, int page, int size) + { + final List pagedFlowJobs = new ArrayList(); + final JdbcTemplate jdbcTemplate = getJdbcTemplate(); + javax.sql.DataSource ds = jdbcTemplate.getDataSource(); + DataSourceTransactionManager tm = new DataSourceTransactionManager(ds); + + TransactionTemplate txTemplate = new TransactionTemplate(tm); + + ObjectNode result; + result = txTemplate.execute(new TransactionCallback() + { + public ObjectNode doInTransaction(TransactionStatus status) + { + String query = SEARCH_JOB_WITH_PAGINATION.replace("$keyword", keyword); + List> rows = null; + + rows = jdbcTemplate.queryForList(query, (page-1)*size, size); + for (Map row : rows) { + + FlowJob flowJob = new FlowJob(); + flowJob.flowId = (Long)row.get(FlowRowMapper.FLOW_ID_COLUMN); + flowJob.jobId = (Long)row.get(FlowRowMapper.JOB_ID_COLUMN); + flowJob.jobName = (String)row.get(FlowRowMapper.JOB_NAME_COLUMN); + flowJob.jobPath = (String)row.get(FlowRowMapper.JOB_PATH_COLUMN); + flowJob.jobType = (String)row.get(FlowRowMapper.JOB_TYPE_COLUMN); + flowJob.flowName = (String)row.get(FlowRowMapper.FLOW_NAME_COLUMN); + flowJob.flowPath = (String)row.get(FlowRowMapper.FLOW_PATH_COLUMN); + flowJob.flowGroup = (String)row.get(FlowRowMapper.FLOW_GROUP_COLUMN); + flowJob.appCode = (String)row.get(FlowRowMapper.APP_CODE_COLUMN); + flowJob.appId = (Integer)row.get(FlowRowMapper.APP_ID_COLUMN); + flowJob.displayName = flowJob.jobName; + flowJob.link = "#/flows/" + flowJob.appCode + "/" + + flowJob.flowGroup + "/" + Long.toString(flowJob.flowId) + "/page/1"; + flowJob.path = flowJob.appCode + "/" + flowJob.jobPath; + + pagedFlowJobs.add(flowJob); + } + long count = 0; + try { + count = jdbcTemplate.queryForObject( + "SELECT FOUND_ROWS()", + Long.class); + } + catch(EmptyResultDataAccessException e) + { + Logger.error("Exception = " + e.getMessage()); + } + + ObjectNode resultNode = Json.newObject(); + resultNode.put("count", count); + resultNode.put("isFlowJob", true); + resultNode.put("page", page); + resultNode.put("itemsPerPage", size); + resultNode.put("totalPages", (int)Math.ceil(count/((double)size))); + resultNode.set("data", Json.toJson(pagedFlowJobs)); + + return resultNode; + } + }); + + return result; + } + public static ObjectNode getPagedCommentsByKeyword(String keyword, int page, int size) { List pagedDatasets = new ArrayList(); diff --git a/web/app/models/FlowJob.java b/web/app/models/FlowJob.java new file mode 100644 index 0000000000..6b4250d555 --- /dev/null +++ b/web/app/models/FlowJob.java @@ -0,0 +1,31 @@ +/** + * Copyright 2015 LinkedIn Corp. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + */ +package models; + +public class FlowJob { + + public Long jobId; + public String displayName; + public String link; + public String jobName; + public String jobPath; + public String jobType; + public String appCode; + public String flowName; + public String flowGroup; + public String flowPath; + public String path; + public Integer appId; + public Long flowId; +} diff --git a/web/app/views/index.scala.html b/web/app/views/index.scala.html index 491d67ea2a..fb02abae91 100644 --- a/web/app/views/index.scala.html +++ b/web/app/views/index.scala.html @@ -1712,6 +1712,12 @@ {{action 'switchSearchToFlow' keyword}}> Flow +