mirror of
https://github.com/datahub-project/datahub.git
synced 2025-07-23 17:39:59 +00:00
Merge pull request #49 from jerrybai2009/master
add job to general search
This commit is contained in:
commit
a63dee9f8c
@ -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));
|
||||
|
@ -22,6 +22,10 @@ import java.sql.SQLException;
|
||||
public class FlowRowMapper implements RowMapper<Flow>
|
||||
{
|
||||
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";
|
||||
|
@ -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<String> metricList = getJdbcTemplate().queryForList(GET_METRIC_AUTO_COMPLETE_LIST, String.class);
|
||||
List<String> flowList = getJdbcTemplate().queryForList(GET_FLOW_AUTO_COMPLETE_LIST, String.class);
|
||||
List<String> jobList = getJdbcTemplate().queryForList(GET_JOB_AUTO_COMPLETE_LIST, String.class);
|
||||
List<String> datasetList = getJdbcTemplate().queryForList(GET_DATASET_AUTO_COMPLETE_LIST, String.class);
|
||||
List<String> 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<Flow> pagedFlows = new ArrayList<Flow>();
|
||||
final List<FlowJob> pagedFlows = new ArrayList<FlowJob>();
|
||||
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<FlowJob> pagedFlowJobs = new ArrayList<FlowJob>();
|
||||
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<ObjectNode>()
|
||||
{
|
||||
public ObjectNode doInTransaction(TransactionStatus status)
|
||||
{
|
||||
String query = SEARCH_JOB_WITH_PAGINATION.replace("$keyword", keyword);
|
||||
List<Map<String, Object>> 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<Dataset> pagedDatasets = new ArrayList<Dataset>();
|
||||
|
31
web/app/models/FlowJob.java
Normal file
31
web/app/models/FlowJob.java
Normal file
@ -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;
|
||||
}
|
@ -1712,6 +1712,12 @@
|
||||
{{action 'switchSearchToFlow' keyword}}>
|
||||
Flow
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-default"
|
||||
{{action 'switchSearchToJob' keyword}}>
|
||||
Job
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-default"
|
||||
@ -1761,22 +1767,22 @@
|
||||
</div>
|
||||
{{/if}}
|
||||
{{#if model.count}}
|
||||
{{#if model.isFlow}}
|
||||
{{#if model.isFlowJob}}
|
||||
<table id="searchresults" class="search-results searchtable">
|
||||
<tbody>
|
||||
{{#each flow in model.data}}
|
||||
{{#each flowJob in model.data}}
|
||||
<tr class="result">
|
||||
<td class="col-xs-12">
|
||||
<div class="dataset-name">
|
||||
<td class="dataset-info">
|
||||
<a href="#/flows/{{flow.appCode}}/{{flow.group}}/{{flow.id}}/page/1">
|
||||
{{flow.name}}
|
||||
<a href="{{flowJob.link}}">
|
||||
{{flowJob.displayName}}
|
||||
</a>
|
||||
</td>
|
||||
<p>
|
||||
{{{ flow.appCode }}}/{{{ flow.path }}}
|
||||
{{{ flowJob.path }}}
|
||||
</p>
|
||||
<p>source: {{{ flow.appCode }}}</p>
|
||||
<p>source: {{{ flowJob.appCode }}}</p>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
@ -96,6 +96,18 @@ App.SearchController = Ember.Controller.extend({
|
||||
}
|
||||
)
|
||||
},
|
||||
switchSearchToJob: function(keyword){
|
||||
this.transitionToRoute
|
||||
( 'search'
|
||||
, { queryParams:
|
||||
{ category: 'Job'
|
||||
, keywords: this.get('keywords')
|
||||
, page: 1
|
||||
, source: null
|
||||
}
|
||||
}
|
||||
)
|
||||
},
|
||||
switchSearchToComments: function(keyword){
|
||||
this.transitionToRoute
|
||||
( 'search'
|
||||
|
Loading…
x
Reference in New Issue
Block a user