mirror of
https://github.com/datahub-project/datahub.git
synced 2025-10-07 06:54:48 +00:00
implement the advanced search for flow and job
This commit is contained in:
parent
a63dee9f8c
commit
8d0e3df5eb
@ -64,6 +64,34 @@ public class AdvSearch extends Controller
|
||||
return ok(result);
|
||||
}
|
||||
|
||||
public static Result getFlowApplicationCodes()
|
||||
{
|
||||
ObjectNode result = Json.newObject();
|
||||
result.put("status", "ok");
|
||||
result.set("appcodes", Json.toJson(AdvSearchDAO.getFlowApplicationCodes()));
|
||||
|
||||
return ok(result);
|
||||
}
|
||||
|
||||
public static Result getFlowNames()
|
||||
{
|
||||
ObjectNode result = Json.newObject();
|
||||
String apps = request().getQueryString("apps");
|
||||
result.put("status", "ok");
|
||||
result.set("flowNames", Json.toJson(AdvSearchDAO.getFlowNames(apps)));
|
||||
|
||||
return ok(result);
|
||||
}
|
||||
|
||||
public static Result getJobNames()
|
||||
{
|
||||
ObjectNode result = Json.newObject();
|
||||
result.put("status", "ok");
|
||||
result.set("jobNames", Json.toJson(AdvSearchDAO.getFlowJobNames()));
|
||||
|
||||
return ok(result);
|
||||
}
|
||||
|
||||
public static Result search()
|
||||
{
|
||||
ObjectNode result = Json.newObject();
|
||||
@ -109,6 +137,16 @@ public class AdvSearch extends Controller
|
||||
}
|
||||
}
|
||||
result.put("status", "ok");
|
||||
if (searchOpt != null && searchOpt.has("category"))
|
||||
{
|
||||
String category = searchOpt.get("category").asText();
|
||||
if(category.equalsIgnoreCase("flow"))
|
||||
{
|
||||
result.set("result", Json.toJson(AdvSearchDAO.searchFlows(searchOpt, page, size)));
|
||||
return ok(result);
|
||||
}
|
||||
}
|
||||
|
||||
result.set("result", Json.toJson(AdvSearchDAO.search(searchOpt, page, size)));
|
||||
|
||||
return ok(result);
|
||||
|
@ -16,6 +16,7 @@ package dao;
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import com.fasterxml.jackson.databind.node.ObjectNode;
|
||||
import models.Dataset;
|
||||
import models.FlowJob;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.dao.EmptyResultDataAccessException;
|
||||
import org.springframework.jdbc.core.JdbcTemplate;
|
||||
@ -34,7 +35,11 @@ import java.util.Map;
|
||||
|
||||
public class AdvSearchDAO extends AbstractMySQLOpenSourceDAO
|
||||
{
|
||||
public final static String GET_DATASET_SOURCES = "SELECT source FROM dict_dataset GROUP BY 1 ORDER BY count(*) DESC";
|
||||
public final static String GET_DATASET_SOURCES = "SELECT source " +
|
||||
"FROM dict_dataset GROUP BY 1 ORDER BY count(*) DESC";
|
||||
|
||||
public final static String GET_FLOW_APPCODES = "SELECT DISTINCT app_code " +
|
||||
"FROM cfg_application GROUP BY 1 ORDER BY 1";
|
||||
|
||||
public final static String GET_DATASET_SCOPES = "SELECT DISTINCT parent_name " +
|
||||
"FROM dict_dataset WHERE parent_name is not null order by 1;";
|
||||
@ -42,8 +47,16 @@ public class AdvSearchDAO extends AbstractMySQLOpenSourceDAO
|
||||
public final static String GET_DATASET_TABLE_NAMES_BY_SCOPE = "SELECT DISTINCT name " +
|
||||
"FROM dict_dataset WHERE parent_name in (:scopes)";
|
||||
|
||||
public final static String GET_FLOW_NAMES_BY_APP = "SELECT DISTINCT f.flow_name " +
|
||||
"FROM flow f JOIN cfg_application a on f.app_id = a.app_id WHERE app in (:apps)";
|
||||
|
||||
public final static String GET_DATASET_TABLE_NAMES = "SELECT DISTINCT name FROM dict_dataset ORDER BY 1";
|
||||
|
||||
public final static String GET_FLOW_NAMES = "SELECT DISTINCT flow_name FROM flow ORDER BY 1";
|
||||
|
||||
public final static String GET_JOB_NAMES = "SELECT DISTINCT job_name " +
|
||||
"FROM flow_job GROUP BY 1 ORDER BY 1";
|
||||
|
||||
public final static String GET_DATASET_FIELDS = "SELECT DISTINCT field_name " +
|
||||
"FROM dict_field_detail ORDER BY 1";
|
||||
|
||||
@ -76,6 +89,19 @@ public class AdvSearchDAO extends AbstractMySQLOpenSourceDAO
|
||||
"(SELECT id FROM field_comments where MATCH(comment) against ('*$keyword*' in BOOLEAN MODE)) ) " +
|
||||
"ORDER BY 2 LIMIT ?, ?;";
|
||||
|
||||
public final static String ADV_SEARCH_FLOW = "SELECT SQL_CALC_FOUND_ROWS " +
|
||||
"a.app_code, f.flow_id, f.flow_name, f.flow_path, f.flow_group FROM flow f " +
|
||||
"JOIN cfg_application a on f.app_id = a.app_id ";
|
||||
|
||||
|
||||
public final static String ADV_SEARCH_JOB = "SELECT SQL_CALC_FOUND_ROWS " +
|
||||
"a.app_code, f.flow_name, f.flow_path, f.flow_group, j.flow_id, j.job_id, " +
|
||||
"j.job_name, j.job_path, j.job_type " +
|
||||
"FROM flow_job j JOIN flow f on j.app_id = f.app_id AND j.flow_id = f.flow_id " +
|
||||
"JOIN cfg_application a on j.app_id = a.app_id ";
|
||||
|
||||
|
||||
|
||||
public static List<String> getDatasetSources()
|
||||
{
|
||||
return getJdbcTemplate().queryForList(GET_DATASET_SOURCES, String.class);
|
||||
@ -136,6 +162,37 @@ public class AdvSearchDAO extends AbstractMySQLOpenSourceDAO
|
||||
return getJdbcTemplate().queryForList(query, String.class);
|
||||
}
|
||||
|
||||
public static List<String> getFlowApplicationCodes()
|
||||
{
|
||||
return getJdbcTemplate().queryForList(GET_FLOW_APPCODES, String.class);
|
||||
}
|
||||
|
||||
public static List<String> getFlowNames(String applications)
|
||||
{
|
||||
List<String> flowNames = null;
|
||||
if (StringUtils.isNotBlank(applications))
|
||||
{
|
||||
String[] appArray = applications.split(",");
|
||||
List<String> appList = Arrays.asList(appArray);
|
||||
Map<String, List> param = Collections.singletonMap("apps", appList);
|
||||
NamedParameterJdbcTemplate namedParameterJdbcTemplate = new
|
||||
NamedParameterJdbcTemplate(getJdbcTemplate().getDataSource());
|
||||
flowNames = namedParameterJdbcTemplate.queryForList(
|
||||
GET_FLOW_NAMES_BY_APP, param, String.class);
|
||||
}
|
||||
else
|
||||
{
|
||||
flowNames = getJdbcTemplate().queryForList(GET_FLOW_NAMES, String.class);
|
||||
}
|
||||
|
||||
return flowNames;
|
||||
}
|
||||
|
||||
public static List<String> getFlowJobNames()
|
||||
{
|
||||
return getJdbcTemplate().queryForList(GET_JOB_NAMES, String.class);
|
||||
}
|
||||
|
||||
public static ObjectNode search(JsonNode searchOpt, int page, int size)
|
||||
{
|
||||
ObjectNode resultNode = Json.newObject();
|
||||
@ -818,4 +875,409 @@ public class AdvSearchDAO extends AbstractMySQLOpenSourceDAO
|
||||
return resultNode;
|
||||
}
|
||||
|
||||
public static ObjectNode searchFlows(JsonNode searchOpt, int page, int size)
|
||||
{
|
||||
ObjectNode resultNode = Json.newObject();
|
||||
int count = 0;
|
||||
List<String> appcodeInList = new ArrayList<String>();
|
||||
List<String> appcodeNotInList = new ArrayList<String>();
|
||||
List<String> flowInList = new ArrayList<String>();
|
||||
List<String> flowNotInList = new ArrayList<String>();
|
||||
List<String> jobInList = new ArrayList<String>();
|
||||
List<String> jobNotInList = new ArrayList<String>();
|
||||
|
||||
if (searchOpt != null && (searchOpt.isContainerNode()))
|
||||
{
|
||||
if (searchOpt.has("appcode")) {
|
||||
JsonNode appcodeNode = searchOpt.get("appcode");
|
||||
if (appcodeNode != null && appcodeNode.isContainerNode())
|
||||
{
|
||||
if (appcodeNode.has("in"))
|
||||
{
|
||||
JsonNode appcodeInNode = appcodeNode.get("in");
|
||||
if (appcodeInNode != null)
|
||||
{
|
||||
String appcodeInStr = appcodeInNode.asText();
|
||||
if (StringUtils.isNotBlank(appcodeInStr))
|
||||
{
|
||||
String[] appcodeInArray = appcodeInStr.split(",");
|
||||
if (appcodeInArray != null)
|
||||
{
|
||||
for(String value : appcodeInArray)
|
||||
{
|
||||
if (StringUtils.isNotBlank(value))
|
||||
{
|
||||
appcodeInList.add(value.trim());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (appcodeNode.has("not"))
|
||||
{
|
||||
JsonNode appcodeNotInNode = appcodeNode.get("not");
|
||||
if (appcodeNotInNode != null)
|
||||
{
|
||||
String appcodeNotInStr = appcodeNotInNode.asText();
|
||||
if (StringUtils.isNotBlank(appcodeNotInStr))
|
||||
{
|
||||
String[] appcodeNotInArray = appcodeNotInStr.split(",");
|
||||
if (appcodeNotInArray != null)
|
||||
{
|
||||
for(String value : appcodeNotInArray)
|
||||
{
|
||||
if (StringUtils.isNotBlank(value))
|
||||
{
|
||||
appcodeNotInList.add(value.trim());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (searchOpt.has("flow")) {
|
||||
JsonNode flowNode = searchOpt.get("flow");
|
||||
if (flowNode != null && flowNode.isContainerNode())
|
||||
{
|
||||
if (flowNode.has("in"))
|
||||
{
|
||||
JsonNode flowInNode = flowNode.get("in");
|
||||
if (flowInNode != null)
|
||||
{
|
||||
String flowInStr = flowInNode.asText();
|
||||
if (StringUtils.isNotBlank(flowInStr))
|
||||
{
|
||||
String[] flowInArray = flowInStr.split(",");
|
||||
if (flowInArray != null)
|
||||
{
|
||||
for(String value : flowInArray)
|
||||
{
|
||||
if (StringUtils.isNotBlank(value))
|
||||
{
|
||||
flowInList.add(value.trim());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (flowNode.has("not"))
|
||||
{
|
||||
JsonNode flowNotInNode = flowNode.get("not");
|
||||
if (flowNotInNode != null)
|
||||
{
|
||||
String flowNotInStr = flowNotInNode.asText();
|
||||
if (StringUtils.isNotBlank(flowNotInStr))
|
||||
{
|
||||
String[] flowNotInArray = flowNotInStr.split(",");
|
||||
if (flowNotInArray != null)
|
||||
{
|
||||
for(String value : flowNotInArray)
|
||||
{
|
||||
if (StringUtils.isNotBlank(value))
|
||||
{
|
||||
flowNotInList.add(value.trim());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (searchOpt.has("job")) {
|
||||
JsonNode jobNode = searchOpt.get("job");
|
||||
if (jobNode != null && jobNode.isContainerNode())
|
||||
{
|
||||
if (jobNode.has("in"))
|
||||
{
|
||||
JsonNode jobInNode = jobNode.get("in");
|
||||
if (jobInNode != null)
|
||||
{
|
||||
String jobInStr = jobInNode.asText();
|
||||
if (StringUtils.isNotBlank(jobInStr))
|
||||
{
|
||||
String[] jobInArray = jobInStr.split(",");
|
||||
if (jobInArray != null)
|
||||
{
|
||||
for(String value : jobInArray)
|
||||
{
|
||||
if (StringUtils.isNotBlank(value))
|
||||
{
|
||||
jobInList.add(value.trim());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (jobNode.has("not"))
|
||||
{
|
||||
JsonNode jobNotInNode = jobNode.get("not");
|
||||
if (jobNotInNode != null)
|
||||
{
|
||||
String jobNotInStr = jobNotInNode.asText();
|
||||
if (StringUtils.isNotBlank(jobNotInStr))
|
||||
{
|
||||
String[] jobNotInArray = jobNotInStr.split(",");
|
||||
if (jobNotInArray != null)
|
||||
{
|
||||
for(String value : jobNotInArray)
|
||||
{
|
||||
if (StringUtils.isNotBlank(value))
|
||||
{
|
||||
jobNotInList.add(value.trim());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
boolean needAndKeyword = false;
|
||||
|
||||
final List<FlowJob> pagedFlows = 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;
|
||||
String query = null;
|
||||
if (jobInList.size() > 0 || jobNotInList.size() > 0)
|
||||
{
|
||||
query = ADV_SEARCH_JOB;
|
||||
}
|
||||
else
|
||||
{
|
||||
query = ADV_SEARCH_FLOW;
|
||||
}
|
||||
|
||||
if (appcodeInList.size() > 0 || appcodeNotInList.size() > 0)
|
||||
{
|
||||
boolean appcodeNeedAndKeyword = false;
|
||||
if (appcodeInList.size() > 0)
|
||||
{
|
||||
int indexForAppcodeInList = 0;
|
||||
for (String appcode : appcodeInList)
|
||||
{
|
||||
if (indexForAppcodeInList == 0)
|
||||
{
|
||||
query += "WHERE a.app_code in ('" + appcode + "'";
|
||||
}
|
||||
else
|
||||
{
|
||||
query += ", '" + appcode + "'";
|
||||
}
|
||||
indexForAppcodeInList++;
|
||||
}
|
||||
query += ") ";
|
||||
appcodeNeedAndKeyword = true;
|
||||
}
|
||||
if (appcodeNotInList.size() > 0)
|
||||
{
|
||||
if (appcodeNeedAndKeyword)
|
||||
{
|
||||
query += " AND ";
|
||||
}
|
||||
else
|
||||
{
|
||||
query += " WHERE ";
|
||||
}
|
||||
int indexForAppcodeNotInList = 0;
|
||||
for (String appcode : appcodeNotInList)
|
||||
{
|
||||
if (indexForAppcodeNotInList == 0)
|
||||
{
|
||||
query += "a.app_code not in ('" + appcode + "'";
|
||||
}
|
||||
else
|
||||
{
|
||||
query += ", '" + appcode + "'";
|
||||
}
|
||||
indexForAppcodeNotInList++;
|
||||
}
|
||||
query += ") ";
|
||||
}
|
||||
needAndKeyword = true;
|
||||
}
|
||||
|
||||
if (flowInList.size() > 0 || flowNotInList.size() > 0)
|
||||
{
|
||||
if (needAndKeyword)
|
||||
{
|
||||
query += " AND ";
|
||||
}
|
||||
else
|
||||
{
|
||||
query += " WHERE ";
|
||||
}
|
||||
boolean flowNeedAndKeyword = false;
|
||||
if (flowInList.size() > 0)
|
||||
{
|
||||
int indexForFlowInList = 0;
|
||||
for (String flow : flowInList)
|
||||
{
|
||||
if (indexForFlowInList == 0)
|
||||
{
|
||||
query += "f.flow_name in ('" + flow + "'";
|
||||
}
|
||||
else
|
||||
{
|
||||
query += ", '" + flow + "'";
|
||||
}
|
||||
indexForFlowInList++;
|
||||
}
|
||||
query += ") ";
|
||||
flowNeedAndKeyword = true;
|
||||
}
|
||||
if (flowNotInList.size() > 0)
|
||||
{
|
||||
if (flowNeedAndKeyword)
|
||||
{
|
||||
query += " AND ";
|
||||
}
|
||||
int indexForFlowNotInList = 0;
|
||||
for (String flow : flowNotInList)
|
||||
{
|
||||
if (indexForFlowNotInList == 0)
|
||||
{
|
||||
query += "f.flow_name not in ('" + flow + "'";
|
||||
}
|
||||
else
|
||||
{
|
||||
query += ", '" + flow + "'";
|
||||
}
|
||||
indexForFlowNotInList++;
|
||||
}
|
||||
query += ") ";
|
||||
}
|
||||
needAndKeyword = true;
|
||||
}
|
||||
|
||||
if (jobInList.size() > 0 || jobNotInList.size() > 0)
|
||||
{
|
||||
if (needAndKeyword)
|
||||
{
|
||||
query += " AND ";
|
||||
}
|
||||
else
|
||||
{
|
||||
query += " WHERE ";
|
||||
}
|
||||
boolean jobNeedAndKeyword = false;
|
||||
if (jobInList.size() > 0)
|
||||
{
|
||||
int indexForJobInList = 0;
|
||||
for (String job : jobInList)
|
||||
{
|
||||
if (indexForJobInList == 0)
|
||||
{
|
||||
query += "j.job_name in ('" + job + "'";
|
||||
}
|
||||
else
|
||||
{
|
||||
query += ", '" + job + "'";
|
||||
}
|
||||
indexForJobInList++;
|
||||
}
|
||||
query += ") ";
|
||||
jobNeedAndKeyword = true;
|
||||
}
|
||||
if (jobNotInList.size() > 0)
|
||||
{
|
||||
if (jobNeedAndKeyword)
|
||||
{
|
||||
query += " AND ";
|
||||
}
|
||||
int indexForJobNotInList = 0;
|
||||
for (String job : jobNotInList)
|
||||
{
|
||||
if (indexForJobNotInList == 0)
|
||||
{
|
||||
query += "j.job_name not in ('" + job + "'";
|
||||
}
|
||||
else
|
||||
{
|
||||
query += ", '" + job + "'";
|
||||
}
|
||||
indexForJobNotInList++;
|
||||
}
|
||||
query += ") ";
|
||||
}
|
||||
}
|
||||
|
||||
query += " LIMIT " + (page-1)*size + ", " + size;
|
||||
final String queryString = query;
|
||||
|
||||
result = txTemplate.execute(new TransactionCallback<ObjectNode>()
|
||||
{
|
||||
public ObjectNode doInTransaction(TransactionStatus status)
|
||||
{
|
||||
List<Map<String, Object>> rows = null;
|
||||
rows = jdbcTemplate.queryForList(queryString);
|
||||
|
||||
for (Map row : rows) {
|
||||
|
||||
FlowJob flow = new FlowJob();
|
||||
flow.appCode = (String)row.get("app_code");
|
||||
flow.flowName = (String)row.get("flow_name");
|
||||
flow.flowPath = (String)row.get("flow_path");
|
||||
flow.flowGroup = (String)row.get("flow_group");
|
||||
flow.jobName = (String)row.get("job_name");
|
||||
flow.jobPath = (String)row.get("job_path");
|
||||
flow.flowId = (Long)row.get("flow_id");
|
||||
if (StringUtils.isNotBlank(flow.jobName))
|
||||
{
|
||||
flow.displayName = flow.jobName;
|
||||
}
|
||||
else
|
||||
{
|
||||
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;
|
||||
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("page", page);
|
||||
resultNode.put("isFlowJob", true);
|
||||
resultNode.put("itemsPerPage", size);
|
||||
resultNode.put("totalPages", (int)Math.ceil(count/((double)size)));
|
||||
resultNode.set("data", Json.toJson(pagedFlows));
|
||||
|
||||
return resultNode;
|
||||
}
|
||||
});
|
||||
return result;
|
||||
}
|
||||
resultNode.put("count", 0);
|
||||
resultNode.put("page", page);
|
||||
resultNode.put("itemsPerPage", size);
|
||||
resultNode.put("totalPages", 0);
|
||||
resultNode.set("data", Json.toJson(""));
|
||||
return resultNode;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1871,6 +1871,29 @@
|
||||
</div>
|
||||
{{/if}}
|
||||
{{#if model.count}}
|
||||
{{#if model.isFlowJob}}
|
||||
<table id="searchresults" class="search-results searchtable">
|
||||
<tbody>
|
||||
{{#each flowJob in model.data}}
|
||||
<tr class="result">
|
||||
<td class="col-xs-12">
|
||||
<div class="dataset-name">
|
||||
<td class="dataset-info">
|
||||
<a href="{{flowJob.link}}">
|
||||
{{flowJob.displayName}}
|
||||
</a>
|
||||
</td>
|
||||
<p>
|
||||
{{{ flowJob.path }}}
|
||||
</p>
|
||||
<p>source: {{{ flowJob.appCode }}}</p>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
{{/each}}
|
||||
</tbody>
|
||||
</table>
|
||||
{{else}}
|
||||
<table id="searchresults" class="search-results searchtable">
|
||||
<tbody>
|
||||
{{#each dataset in model.data}}
|
||||
@ -1893,6 +1916,7 @@
|
||||
{{/each}}
|
||||
</tbody>
|
||||
</table>
|
||||
{{/if}}
|
||||
{{else}}
|
||||
{{#if showNoResult}}
|
||||
<h4>No items found</h4>
|
||||
|
@ -188,151 +188,267 @@
|
||||
<h3 class="modal-title" id="myModalLabel">Advanced Search</h3>
|
||||
</div>
|
||||
<div class="modal-body advSearch">
|
||||
<div class="row">
|
||||
<div class="col-md-10 rightPartialBorder">
|
||||
<ul id="advsearchtabs" class="nav nav-tabs">
|
||||
<li id="datasetAdvSearchLink"><a data-toggle="tab" href="#datasetAdvTab">Datasets</a></li>
|
||||
<li><a data-toggle="tab" href="#flowAdvtab">Flows</a></li>
|
||||
</ul>
|
||||
<div class="tab-content">
|
||||
<div id="datasetAdvTab" class="tab-pane">
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<div class="control-group">
|
||||
<label class="control-label">Scope</label>
|
||||
<div class="controls">
|
||||
<div class="row">
|
||||
<div class="col-xs-3 text-right">
|
||||
In
|
||||
</div>
|
||||
<div class="col-xs-9">
|
||||
<input
|
||||
id="scopeInInput"
|
||||
class="scopeInput"
|
||||
placeholder="<db_name>, <top_level_dir>"
|
||||
title="Scope can be database schema name or top level HDFS directory which is used to narrow down the search range"
|
||||
style="width: 100%;">
|
||||
</input>
|
||||
<div class="col-md-10 rightPartialBorder">
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<div class="control-group col-md-12">
|
||||
<label class="control-label">Scope</label>
|
||||
<div class="controls">
|
||||
<div class="row">
|
||||
<div class="col-xs-3 text-right">
|
||||
In
|
||||
</div>
|
||||
<div class="col-xs-9">
|
||||
<input
|
||||
id="scopeInInput"
|
||||
class="scopeInput"
|
||||
placeholder="<db_name>, <top_level_dir>"
|
||||
title="Scope can be database schema name or top level HDFS directory which is used to narrow down the search range"
|
||||
style="width: 100%;">
|
||||
</input>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-xs-3 text-right">
|
||||
Not In
|
||||
</div>
|
||||
<div class="col-xs-9">
|
||||
<input
|
||||
id="scopeNotInInput"
|
||||
class="scopeInput"
|
||||
placeholder="<db_name_to_exclude>"
|
||||
title="Scope can be database schema name or top level HDFS directory which is used to narrow down the search range"
|
||||
style="width: 100%;">
|
||||
</input>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-xs-3 text-right">
|
||||
Not In
|
||||
</div>
|
||||
<div class="col-md-12">
|
||||
<div class="control-group col-md-12">
|
||||
<label class="control-label">Table</label>
|
||||
<div class="controls">
|
||||
<div class="row">
|
||||
<div class="col-xs-3 text-right">
|
||||
In
|
||||
</div>
|
||||
<div class="col-xs-9">
|
||||
<input
|
||||
id="tableInInput"
|
||||
class="tableInput"
|
||||
placeholder="<table_name>, <view_name>"
|
||||
style="width: 100%;">
|
||||
</input>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-xs-3 text-right">
|
||||
Not In
|
||||
</div>
|
||||
<div class="col-xs-9">
|
||||
<input
|
||||
id="tableNotInInput"
|
||||
class="tableInput"
|
||||
placeholder="<table_name_to_exclude>"
|
||||
style="width: 100%;">
|
||||
</input>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-xs-9">
|
||||
<input
|
||||
id="scopeNotInInput"
|
||||
class="scopeInput"
|
||||
placeholder="<db_name_to_exclude>"
|
||||
title="Scope can be database schema name or top level HDFS directory which is used to narrow down the search range"
|
||||
style="width: 100%;">
|
||||
</input>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<div class="form-group col-md-12">
|
||||
<label class="control-label">Fields</label>
|
||||
<div class="controls">
|
||||
<div class="row">
|
||||
<div class="col-xs-3 text-right">
|
||||
Contains Any
|
||||
</div>
|
||||
<div class="col-xs-9">
|
||||
<input
|
||||
id="fieldAnyInput"
|
||||
class="fieldInput"
|
||||
placeholder="<partial_field_name>"
|
||||
style="width: 100%;">
|
||||
</input>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-xs-3 text-right">
|
||||
Contains All
|
||||
</div>
|
||||
<div class="col-xs-9">
|
||||
<input
|
||||
id="fieldAllInput"
|
||||
class="fieldInput"
|
||||
placeholder="<field_name_1>, <field_name_2>"
|
||||
style="width: 100%;">
|
||||
</input>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-xs-3 text-right">
|
||||
Doesn't Contain
|
||||
</div>
|
||||
<div class="col-xs-9">
|
||||
<input
|
||||
id="fieldNotInInput"
|
||||
class="fieldInput"
|
||||
placeholder="<field_name_to_exclude>"
|
||||
style="width: 100%;">
|
||||
</input>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-12">
|
||||
<div class="form-group col-md-12">
|
||||
<label class="control-label">Comments</label>
|
||||
<div class="controls">
|
||||
<div class="row">
|
||||
<div class="col-xs-3 text-right">
|
||||
Contains
|
||||
</div>
|
||||
<div class="col-xs-9">
|
||||
<input
|
||||
id="commentsInput"
|
||||
type="text"
|
||||
placeholder="<phrase_in_comment>"
|
||||
class="col-md-4 form-control"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-12">
|
||||
<div class="control-group">
|
||||
<label class="control-label">Table</label>
|
||||
<div class="controls">
|
||||
<div class="row">
|
||||
<div class="col-xs-3 text-right">
|
||||
In
|
||||
</div>
|
||||
<div class="col-xs-9">
|
||||
<input
|
||||
id="tableInInput"
|
||||
class="tableInput"
|
||||
placeholder="<table_name>, <view_name>"
|
||||
style="width: 100%;">
|
||||
</input>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-xs-3 text-right">
|
||||
Not In
|
||||
</div>
|
||||
<div class="col-xs-9">
|
||||
<input
|
||||
id="tableNotInInput"
|
||||
class="tableInput"
|
||||
placeholder="<table_name_to_exclude>"
|
||||
style="width: 100%;">
|
||||
</input>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<div class="form-group">
|
||||
<label class="control-label">Fields</label>
|
||||
<div class="controls">
|
||||
<div class="row">
|
||||
<div class="col-xs-3 text-right">
|
||||
Contains Any
|
||||
</div>
|
||||
<div class="col-xs-9">
|
||||
<input
|
||||
id="fieldAnyInput"
|
||||
class="fieldInput"
|
||||
placeholder="<partial_field_name>"
|
||||
style="width: 100%;">
|
||||
</input>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-xs-3 text-right">
|
||||
Contains All
|
||||
</div>
|
||||
<div class="col-xs-9">
|
||||
<input
|
||||
id="fieldAllInput"
|
||||
class="fieldInput"
|
||||
placeholder="<field_name_1>, <field_name_2>"
|
||||
style="width: 100%;">
|
||||
</input>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-xs-3 text-right">
|
||||
Doesn't Contain
|
||||
</div>
|
||||
<div class="col-xs-9">
|
||||
<input
|
||||
id="fieldNotInInput"
|
||||
class="fieldInput"
|
||||
placeholder="<field_name_to_exclude>"
|
||||
style="width: 100%;">
|
||||
</input>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-12">
|
||||
<div class="form-group">
|
||||
<label class="control-label">Comments</label>
|
||||
<div class="controls">
|
||||
<div class="row">
|
||||
<div class="col-xs-3 text-right">
|
||||
Contains
|
||||
</div>
|
||||
<div class="col-xs-9">
|
||||
<input
|
||||
id="commentsInput"
|
||||
type="text"
|
||||
placeholder="<phrase_in_comment>"
|
||||
class="col-md-4 form-control"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="advSearchSource" class="col-md-2">
|
||||
<h4>Sources</h4>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="advSearchSource" class="col-md-2">
|
||||
<h4>Sources</h4>
|
||||
<div id="flowAdvtab" class="tab-pane">
|
||||
<div class="row">
|
||||
<div class="col-md-12 rightPartialBorder">
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<div class="control-group col-md-12">
|
||||
<label class="control-label">Application Code</label>
|
||||
<div class="controls">
|
||||
<div class="row">
|
||||
<div class="col-xs-3 text-right">
|
||||
In
|
||||
</div>
|
||||
<div class="col-xs-9">
|
||||
<input
|
||||
id="appcodeInInput"
|
||||
class="appcodeInput"
|
||||
placeholder="<app_code1>, <app_code2>"
|
||||
title="Application Code"
|
||||
style="width: 100%;">
|
||||
</input>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-xs-3 text-right">
|
||||
Not In
|
||||
</div>
|
||||
<div class="col-xs-9">
|
||||
<input
|
||||
id="appcodeNotInInput"
|
||||
class="appcodeInput"
|
||||
placeholder="<app_code_to_exclude>"
|
||||
title="Application Code"
|
||||
style="width: 100%;">
|
||||
</input>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-12">
|
||||
<div class="control-group col-md-12">
|
||||
<label class="control-label">Flow Name</label>
|
||||
<div class="controls">
|
||||
<div class="row">
|
||||
<div class="col-xs-3 text-right">
|
||||
In
|
||||
</div>
|
||||
<div class="col-xs-9">
|
||||
<input
|
||||
id="flowInInput"
|
||||
class="flowInput"
|
||||
placeholder="<flow_name1>, <flow_name2>"
|
||||
style="width: 100%;">
|
||||
</input>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-xs-3 text-right">
|
||||
Not In
|
||||
</div>
|
||||
<div class="col-xs-9">
|
||||
<input
|
||||
id="flowNotInInput"
|
||||
class="flowInput"
|
||||
placeholder="<flow_name_to_exclude>"
|
||||
style="width: 100%;">
|
||||
</input>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-12">
|
||||
<div class="control-group col-md-12">
|
||||
<label class="control-label">Job Name</label>
|
||||
<div class="controls">
|
||||
<div class="row">
|
||||
<div class="col-xs-3 text-right">
|
||||
In
|
||||
</div>
|
||||
<div class="col-xs-9">
|
||||
<input
|
||||
id="jobInInput"
|
||||
class="jobInput"
|
||||
placeholder="<job_name1>, <job_name2>"
|
||||
style="width: 100%;">
|
||||
</input>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-xs-3 text-right">
|
||||
Not In
|
||||
</div>
|
||||
<div class="col-xs-9">
|
||||
<input
|
||||
id="jobNotInInput"
|
||||
class="jobInput"
|
||||
placeholder="<job_name_to_exclude>"
|
||||
style="width: 100%;">
|
||||
</input>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="modal-footer">
|
||||
|
@ -127,6 +127,12 @@ GET /api/v1/advsearch/tables controllers.api.v1.AdvSearch
|
||||
|
||||
GET /api/v1/advsearch/fields controllers.api.v1.AdvSearch.getDatasetFields()
|
||||
|
||||
GET /api/v1/advsearch/appcodes controllers.api.v1.AdvSearch.getFlowApplicationCodes()
|
||||
|
||||
GET /api/v1/advsearch/flowNames controllers.api.v1.AdvSearch.getFlowNames()
|
||||
|
||||
GET /api/v1/advsearch/jobNames controllers.api.v1.AdvSearch.getJobNames()
|
||||
|
||||
GET /api/v1/advsearch/search controllers.api.v1.AdvSearch.search()
|
||||
|
||||
GET /api/v1/lineage/dataset/:id controllers.api.v1.Lineage.getDatasetLineageGraphData(id:Int)
|
||||
|
@ -73,6 +73,8 @@
|
||||
})
|
||||
|
||||
var currentTab = 'Dataset';
|
||||
$('#advsearchtabs a:first').tab("show");
|
||||
$('#datasetAdvSearchLink').addClass("active");
|
||||
|
||||
var width = $(window).width()*0.99;
|
||||
var height = ($(window).height() * 0.99) - 82;
|
||||
|
@ -118,6 +118,69 @@
|
||||
});
|
||||
});
|
||||
|
||||
$.get('/api/v1/advsearch/appcodes', function(data){
|
||||
$(".appcodeInput").autocomplete({
|
||||
minLength: 0,
|
||||
source: function( req, res ) {
|
||||
var results = $.ui.autocomplete.filter(data.appcodes, extractLast( req.term ));
|
||||
res(results.slice(0,maxReturnedResults));
|
||||
},
|
||||
focus: function() {
|
||||
return false;
|
||||
},
|
||||
select: function( event, ui ) {
|
||||
var terms = split( this.value );
|
||||
terms.pop();
|
||||
terms.push( ui.item.value );
|
||||
terms.push( "" );
|
||||
this.value = terms.join( ", " );
|
||||
return false;
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$.get('/api/v1/advsearch/flowNames', function(data){
|
||||
$(".flowInput").autocomplete({
|
||||
minLength: 0,
|
||||
source: function( req, res ) {
|
||||
var results = $.ui.autocomplete.filter(data.flowNames, extractLast( req.term ));
|
||||
res(results.slice(0,maxReturnedResults));
|
||||
},
|
||||
focus: function() {
|
||||
return false;
|
||||
},
|
||||
select: function( event, ui ) {
|
||||
var terms = split( this.value );
|
||||
terms.pop();
|
||||
terms.push( ui.item.value );
|
||||
terms.push( "" );
|
||||
this.value = terms.join( ", " );
|
||||
return false;
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$.get('/api/v1/advsearch/jobNames', function(data){
|
||||
$(".jobInput").autocomplete({
|
||||
minLength: 0,
|
||||
source: function( req, res ) {
|
||||
var results = $.ui.autocomplete.filter(data.jobNames, extractLast( req.term ));
|
||||
res(results.slice(0,maxReturnedResults));
|
||||
},
|
||||
focus: function() {
|
||||
return false;
|
||||
},
|
||||
select: function( event, ui ) {
|
||||
var terms = split( this.value );
|
||||
terms.pop();
|
||||
terms.push( ui.item.value );
|
||||
terms.push( "" );
|
||||
this.value = terms.join( ", " );
|
||||
return false;
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$( "#scopeInInput" ).blur(function() {
|
||||
$.get('/api/v1/advsearch/tables', {scopes: $( "#scopeInInput").val()}, function(data){
|
||||
$(".tableInput").autocomplete({
|
||||
@ -176,7 +239,8 @@
|
||||
}
|
||||
});
|
||||
|
||||
$('#advSearchBtn').click(function(){
|
||||
function advSearchForDataset()
|
||||
{
|
||||
var empty = true;
|
||||
var scopeInInputObj = $('#scopeInInput');
|
||||
var scopeIn = '';
|
||||
@ -185,7 +249,7 @@
|
||||
scopeIn = scopeInInputObj.val();
|
||||
if (scopeIn)
|
||||
{
|
||||
empty = false;
|
||||
empty = false;
|
||||
}
|
||||
}
|
||||
var scopeNotInInputObj = $('#scopeNotInInput');
|
||||
@ -195,7 +259,7 @@
|
||||
scopeNotIn = scopeNotInInputObj.val();
|
||||
if (scopeNotIn)
|
||||
{
|
||||
empty = false;
|
||||
empty = false;
|
||||
}
|
||||
}
|
||||
var tableInInputObj = $('#tableInInput');
|
||||
@ -205,7 +269,7 @@
|
||||
tableIn = tableInInputObj.val();
|
||||
if (tableIn)
|
||||
{
|
||||
empty = false;
|
||||
empty = false;
|
||||
}
|
||||
}
|
||||
var tableNotInInputObj = $('#tableNotInInput');
|
||||
@ -215,7 +279,7 @@
|
||||
tableNotIn = tableNotInInputObj.val();
|
||||
if (tableNotIn)
|
||||
{
|
||||
empty = false;
|
||||
empty = false;
|
||||
}
|
||||
}
|
||||
var fieldAnyInputObj = $('#fieldAnyInput');
|
||||
@ -225,7 +289,7 @@
|
||||
fieldAny = fieldAnyInputObj.val();
|
||||
if (fieldAny)
|
||||
{
|
||||
empty = false;
|
||||
empty = false;
|
||||
}
|
||||
}
|
||||
var fieldAllInputObj = $('#fieldAllInput');
|
||||
@ -235,7 +299,7 @@
|
||||
fieldAll = fieldAllInputObj.val();
|
||||
if (fieldAll)
|
||||
{
|
||||
empty = false;
|
||||
empty = false;
|
||||
}
|
||||
}
|
||||
var fieldNotInInputObj = $('#fieldNotInInput');
|
||||
@ -245,7 +309,7 @@
|
||||
fieldNotIn = fieldNotInInputObj.val();
|
||||
if (fieldNotIn)
|
||||
{
|
||||
empty = false;
|
||||
empty = false;
|
||||
}
|
||||
}
|
||||
var commentsInputObj = $('#commentsInput');
|
||||
@ -255,7 +319,7 @@
|
||||
comments = commentsInputObj.val();
|
||||
if (comments)
|
||||
{
|
||||
empty = false;
|
||||
empty = false;
|
||||
}
|
||||
}
|
||||
var sources = '';
|
||||
@ -265,20 +329,114 @@
|
||||
sources = sources.substring(0, sources.length-1);
|
||||
if (sources)
|
||||
{
|
||||
empty = false;
|
||||
empty = false;
|
||||
}
|
||||
if (empty)
|
||||
{
|
||||
return;
|
||||
return;
|
||||
}
|
||||
|
||||
var advSearchOpts = {};
|
||||
advSearchOpts.category = 'Dataset';
|
||||
advSearchOpts.scope = {'in': scopeIn, 'not': scopeNotIn};
|
||||
advSearchOpts.table = {'in': tableIn, 'not': tableNotIn};
|
||||
advSearchOpts.fields = {'any': fieldAny, 'all': fieldAll, 'not': fieldNotIn};
|
||||
advSearchOpts.comments = comments;
|
||||
advSearchOpts.sources = sources;
|
||||
window.location.hash = "#/advsearch/?query=" + btoa(JSON.stringify(advSearchOpts)) + '&page=1';
|
||||
}
|
||||
|
||||
function advSearchForFlow()
|
||||
{
|
||||
var empty = true;
|
||||
var appcodeInInputObj = $('#appcodeInInput');
|
||||
var appcodeIn = '';
|
||||
if (appcodeInInputObj)
|
||||
{
|
||||
appcodeIn = appcodeInInputObj.val();
|
||||
if (appcodeIn)
|
||||
{
|
||||
empty = false;
|
||||
}
|
||||
}
|
||||
var appcodeNotInInputObj = $('#appcodeNotInInput');
|
||||
var appcodeNotIn = '';
|
||||
if (appcodeNotInInputObj)
|
||||
{
|
||||
appcodeNotIn = appcodeNotInInputObj.val();
|
||||
if (appcodeNotIn)
|
||||
{
|
||||
empty = false;
|
||||
}
|
||||
}
|
||||
var flowInInputObj = $('#flowInInput');
|
||||
var flowIn = '';
|
||||
if (flowInInputObj)
|
||||
{
|
||||
flowIn = flowInInputObj.val();
|
||||
if (flowIn)
|
||||
{
|
||||
empty = false;
|
||||
}
|
||||
}
|
||||
var flowNotInInputObj = $('#flowNotInInput');
|
||||
var flowNotIn = '';
|
||||
if (flowNotInInputObj)
|
||||
{
|
||||
flowNotIn = flowNotInInputObj.val();
|
||||
if (flowNotIn)
|
||||
{
|
||||
empty = false;
|
||||
}
|
||||
}
|
||||
var jobInInputObj = $('#jobInInput');
|
||||
var jobIn = '';
|
||||
if (jobInInputObj)
|
||||
{
|
||||
jobIn = jobInInputObj.val();
|
||||
if (jobIn)
|
||||
{
|
||||
empty = false;
|
||||
}
|
||||
}
|
||||
var jobNotInInputObj = $('#jobNotInInput');
|
||||
var jobNotIn = '';
|
||||
if (jobNotInInputObj)
|
||||
{
|
||||
jobNotIn = jobNotInInputObj.val();
|
||||
if (jobNotIn)
|
||||
{
|
||||
empty = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (empty)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var advSearchOpts = {};
|
||||
advSearchOpts.category = 'Flow';
|
||||
advSearchOpts.appcode = {'in': appcodeIn, 'not': appcodeNotIn};
|
||||
advSearchOpts.flow = {'in': flowIn, 'not': flowNotIn};
|
||||
advSearchOpts.job = {'in': jobIn, 'not': jobNotIn};
|
||||
window.location.hash = "#/advsearch/?query=" + btoa(JSON.stringify(advSearchOpts)) + '&page=1';
|
||||
}
|
||||
|
||||
$('#advSearchBtn').click(function(){
|
||||
var obj = $("#advsearchtabs").find(".active")
|
||||
if (obj)
|
||||
{
|
||||
var text = obj.text();
|
||||
if (text == 'Datasets')
|
||||
{
|
||||
advSearchForDataset();
|
||||
}
|
||||
else
|
||||
{
|
||||
advSearchForFlow();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
$('#advSearchResetBtn').click(function(){
|
||||
@ -325,6 +483,36 @@
|
||||
$('input[name="sourceCheckbox"]:checked').each(function() {
|
||||
this.checked = false;
|
||||
});
|
||||
var appcodeInInputObj = $('#appcodeInInput');
|
||||
if (appcodeInInputObj)
|
||||
{
|
||||
appcodeInInputObj.val('');
|
||||
}
|
||||
var appcodeNotInInputObj = $('#appcodeNotInInput');
|
||||
if (appcodeNotInInputObj)
|
||||
{
|
||||
appcodeNotInInputObj.val('');
|
||||
}
|
||||
var flowInInputObj = $('#flowInInput');
|
||||
if (flowInInputObj)
|
||||
{
|
||||
flowInInputObj.val('');
|
||||
}
|
||||
var flowNotInInputObj = $('#flowNotInInput');
|
||||
if (flowNotInInputObj)
|
||||
{
|
||||
flowNotInInputObj.val('');
|
||||
}
|
||||
var jobInInputObj = $('#jobInInput');
|
||||
if (jobInInputObj)
|
||||
{
|
||||
jobInInputObj.val('');
|
||||
}
|
||||
var jobNotInInputObj = $('#jobNotInInput');
|
||||
if (jobNotInInputObj)
|
||||
{
|
||||
jobNotInInputObj.val('');
|
||||
}
|
||||
});
|
||||
|
||||
})(jQuery)
|
||||
|
Loading…
x
Reference in New Issue
Block a user