implement the advanced search for flow and job

This commit is contained in:
jbai 2016-03-01 19:43:46 -08:00
parent a63dee9f8c
commit 8d0e3df5eb
7 changed files with 979 additions and 143 deletions

View File

@ -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);

View File

@ -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;
}
}

View File

@ -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>

View File

@ -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">

View File

@ -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)

View File

@ -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;

View File

@ -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)