Skip to content

Commit

Permalink
Merge pull request datahub-project#49 from jerrybai2009/master
Browse files Browse the repository at this point in the history
add job to general search
  • Loading branch information
jerrybai2009 committed Mar 1, 2016
2 parents b9d2588 + f288090 commit a63dee9
Show file tree
Hide file tree
Showing 6 changed files with 155 additions and 16 deletions.
4 changes: 4 additions & 0 deletions web/app/controllers/api/v1/Search.java
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,10 @@ else if (category.toLowerCase().equalsIgnoreCase("flow"))
{
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));
Expand Down
4 changes: 4 additions & 0 deletions web/app/dao/FlowRowMapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,10 @@
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";
Expand Down
102 changes: 92 additions & 10 deletions web/app/dao/SearchDAO.java
Original file line number Diff line number Diff line change
Expand Up @@ -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`, " +
Expand Down Expand Up @@ -138,9 +152,11 @@ public static List<String> getAutoCompleteList()
{
//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;
Expand Down Expand Up @@ -287,7 +303,7 @@ public ObjectNode doInTransaction(TransactionStatus status)

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);
Expand All @@ -305,15 +321,17 @@ public ObjectNode doInTransaction(TransactionStatus status)
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;
Expand All @@ -329,7 +347,7 @@ public ObjectNode doInTransaction(TransactionStatus status)

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)));
Expand All @@ -342,6 +360,70 @@ public ObjectNode doInTransaction(TransactionStatus status)
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>();
Expand Down
31 changes: 31 additions & 0 deletions web/app/models/FlowJob.java
Original file line number Diff line number Diff line change
@@ -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;
}
18 changes: 12 additions & 6 deletions web/app/views/index.scala.html
Original file line number Diff line number Diff line change
Expand Up @@ -1712,6 +1712,12 @@ <h4 class="panel-title">
{{action 'switchSearchToFlow' keyword}}>
Flow
</button>
<button
type="button"
class="btn btn-default"
{{action 'switchSearchToJob' keyword}}>
Job
</button>
<button
type="button"
class="btn btn-default"
Expand Down Expand Up @@ -1761,22 +1767,22 @@ <h4 class="panel-title">
</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>
Expand Down
12 changes: 12 additions & 0 deletions web/public/javascripts/controllers/search.js
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand Down

0 comments on commit a63dee9

Please sign in to comment.