mirror of
https://github.com/datahub-project/datahub.git
synced 2025-11-03 04:10:43 +00:00
implement the dataset accessiblities section
This commit is contained in:
parent
5305124d8c
commit
45c528c9d9
@ -804,4 +804,20 @@ public class Dataset extends Controller
|
||||
return ok(result);
|
||||
}
|
||||
|
||||
public static Result getDatasetPartitions(Long datasetId)
|
||||
{
|
||||
ObjectNode result = Json.newObject();
|
||||
result.put("status", "ok");
|
||||
result.put("partitions", Json.toJson(DatasetsDAO.getDatasetPartitionGains(datasetId)));
|
||||
return ok(result);
|
||||
}
|
||||
|
||||
public static Result getDatasetAccess(Long datasetId)
|
||||
{
|
||||
ObjectNode result = Json.newObject();
|
||||
result.put("status", "ok");
|
||||
result.put("access", Json.toJson(DatasetsDAO.getDatasetAccessibilty(datasetId)));
|
||||
return ok(result);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -351,6 +351,19 @@ public class DatasetsDAO extends AbstractMySQLOpenSourceDAO
|
||||
"dict_dataset_instance i JOIN cfg_database c ON i.db_id = c.db_id " +
|
||||
"WHERE i.dataset_id = ?";
|
||||
|
||||
private final static String GET_DATASET_ACCESS_PARTITION_GAIN = "SELECT DISTINCT partition_grain " +
|
||||
"FROM log_dataset_instance_load_status WHERE dataset_id = ? order by 1";
|
||||
|
||||
private final static String GET_DATASET_ACCESS_PARTITION_INSTANCES = "SELECT DISTINCT d.db_code " +
|
||||
"FROM log_dataset_instance_load_status l " +
|
||||
"JOIN cfg_database d on l.db_id = d.db_id WHERE dataset_id = ? and partition_grain = ? ORDER BY 1";
|
||||
|
||||
private final static String GET_DATASET_ACCESS = "SELECT l.db_id, d.db_code, l.dataset_type, l.partition_expr, " +
|
||||
"l.data_time_expr, l.data_time_epoch, l.record_count, l.size_in_byte, l.log_time_epoch, " +
|
||||
"from_unixtime(l.log_time_epoch) as log_time_str FROM log_dataset_instance_load_status l " +
|
||||
"JOIN cfg_database d on l.db_id = d.db_id WHERE dataset_id = ? and partition_grain = ? " +
|
||||
"ORDER by l.data_time_expr DESC";
|
||||
|
||||
public static List<String> getDatasetOwnerTypes()
|
||||
{
|
||||
return getJdbcTemplate().queryForList(GET_DATASET_OWNER_TYPES, String.class);
|
||||
@ -1985,4 +1998,103 @@ public class DatasetsDAO extends AbstractMySQLOpenSourceDAO
|
||||
}
|
||||
return datasetInstances;
|
||||
}
|
||||
|
||||
public static List<String> getDatasetPartitionGains(Long id) {
|
||||
return getJdbcTemplate().queryForList(GET_DATASET_ACCESS_PARTITION_GAIN, String.class, id);
|
||||
}
|
||||
|
||||
public static List<String> getDatasetPartitionInstance(Long id, String partition) {
|
||||
return getJdbcTemplate().queryForList(GET_DATASET_ACCESS_PARTITION_INSTANCES, String.class, id, partition);
|
||||
}
|
||||
|
||||
public static List<DatasetPartition> getDatasetAccessibilty(Long id) {
|
||||
|
||||
ObjectNode resultNode = Json.newObject();
|
||||
List<String> partitions = getDatasetPartitionGains(id);
|
||||
List<DatasetPartition> datasetPartitions = new ArrayList<DatasetPartition>();
|
||||
if (partitions != null && partitions.size() > 0)
|
||||
{
|
||||
for(String partition:partitions)
|
||||
{
|
||||
List<Map<String, Object>> rows = null;
|
||||
Map<String, DatasetAccessibility> addedAccessibilities= new HashMap<String, DatasetAccessibility>();
|
||||
rows = getJdbcTemplate().queryForList(
|
||||
GET_DATASET_ACCESS,
|
||||
id,
|
||||
partition);
|
||||
List<DatasetAccessibility> datasetAccessibilities = new ArrayList<DatasetAccessibility>();
|
||||
List<String> instances = new ArrayList<String>();
|
||||
instances = getDatasetPartitionInstance(id, partition);
|
||||
|
||||
if (rows != null)
|
||||
{
|
||||
for (Map row : rows) {
|
||||
DatasetAccessibility datasetAccessibility = new DatasetAccessibility();
|
||||
datasetAccessibility.datasetId = id;
|
||||
datasetAccessibility.itemList = new ArrayList<DatasetAccessItem>();
|
||||
datasetAccessibility.dbId = (Integer) row.get("db_id");
|
||||
datasetAccessibility.dbName = (String) row.get("db_code");
|
||||
datasetAccessibility.datasetType = (String) row.get("dataset_type");
|
||||
datasetAccessibility.partitionExpr = (String) row.get("partition_expr");
|
||||
datasetAccessibility.partitionGain = partition;
|
||||
datasetAccessibility.dataTimeExpr = (String) row.get("data_time_expr");
|
||||
datasetAccessibility.dataTimeEpoch = (Integer) row.get("data_time_epoch");
|
||||
datasetAccessibility.recordCount = (Long) row.get("record_count");
|
||||
if (datasetAccessibility.recordCount == null)
|
||||
{
|
||||
datasetAccessibility.recordCount = 0L;
|
||||
}
|
||||
datasetAccessibility.sizeInByte = (Long) row.get("size_in_byte");
|
||||
datasetAccessibility.logTimeEpoch = (Integer) row.get("log_time_epoch");
|
||||
datasetAccessibility.logTimeEpochStr = row.get("log_time_str").toString();
|
||||
DatasetAccessibility exist = addedAccessibilities.get(datasetAccessibility.dataTimeExpr);
|
||||
if (exist == null)
|
||||
{
|
||||
for(int i = 0; i < instances.size(); i++)
|
||||
{
|
||||
DatasetAccessItem datasetAccessItem = new DatasetAccessItem();
|
||||
if(instances.get(i).equalsIgnoreCase(datasetAccessibility.dbName))
|
||||
{
|
||||
datasetAccessItem.recordCountStr = Long.toString(datasetAccessibility.recordCount);
|
||||
datasetAccessItem.logTimeEpochStr = datasetAccessibility.logTimeEpochStr;
|
||||
datasetAccessItem.isPlaceHolder = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
datasetAccessItem.recordCountStr = "";
|
||||
datasetAccessItem.logTimeEpochStr = "";
|
||||
datasetAccessItem.isPlaceHolder = true;
|
||||
}
|
||||
datasetAccessibility.itemList.add(datasetAccessItem);
|
||||
}
|
||||
addedAccessibilities.put(datasetAccessibility.dataTimeExpr, datasetAccessibility);
|
||||
datasetAccessibilities.add(datasetAccessibility);
|
||||
}
|
||||
else
|
||||
{
|
||||
for(int i = 0; i < instances.size(); i++)
|
||||
{
|
||||
if(instances.get(i).equalsIgnoreCase(datasetAccessibility.dbName))
|
||||
{
|
||||
DatasetAccessItem datasetAccessItem = new DatasetAccessItem();
|
||||
datasetAccessItem.logTimeEpochStr = datasetAccessibility.logTimeEpochStr;
|
||||
datasetAccessItem.recordCountStr = Long.toString(datasetAccessibility.recordCount);
|
||||
datasetAccessItem.isPlaceHolder = false;
|
||||
exist.itemList.set(i, datasetAccessItem);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
DatasetPartition datasetPartition = new DatasetPartition();
|
||||
datasetPartition.datasetId = id;
|
||||
datasetPartition.accessibilityList = datasetAccessibilities;
|
||||
datasetPartition.instanceList = instances;
|
||||
datasetPartition.partition = partition;
|
||||
datasetPartitions.add(datasetPartition);
|
||||
}
|
||||
}
|
||||
|
||||
return datasetPartitions;
|
||||
}
|
||||
}
|
||||
|
||||
24
web/app/models/DatasetAccessItem.java
Normal file
24
web/app/models/DatasetAccessItem.java
Normal file
@ -0,0 +1,24 @@
|
||||
/**
|
||||
* 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;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class DatasetAccessItem {
|
||||
|
||||
public String recordCountStr;
|
||||
public String sizeInByteStr;
|
||||
public String logTimeEpochStr;
|
||||
public Boolean isPlaceHolder;
|
||||
}
|
||||
33
web/app/models/DatasetAccessibility.java
Normal file
33
web/app/models/DatasetAccessibility.java
Normal file
@ -0,0 +1,33 @@
|
||||
/**
|
||||
* 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;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class DatasetAccessibility {
|
||||
|
||||
public Long datasetId;
|
||||
public Integer dbId;
|
||||
public String dbName;
|
||||
public String datasetType;
|
||||
public String partitionGain;
|
||||
public String partitionExpr;
|
||||
public String dataTimeExpr;
|
||||
public Integer dataTimeEpoch;
|
||||
public Long recordCount;
|
||||
public Long sizeInByte;
|
||||
public Integer logTimeEpoch;
|
||||
public String logTimeEpochStr;
|
||||
public List<DatasetAccessItem> itemList;
|
||||
}
|
||||
24
web/app/models/DatasetPartition.java
Normal file
24
web/app/models/DatasetPartition.java
Normal file
@ -0,0 +1,24 @@
|
||||
/**
|
||||
* 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;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class DatasetPartition {
|
||||
|
||||
public Long datasetId;
|
||||
public List<DatasetAccessibility> accessibilityList;
|
||||
public List<String> instanceList;
|
||||
public String partition;
|
||||
}
|
||||
@ -537,6 +537,43 @@
|
||||
{{/if}}
|
||||
</script>
|
||||
|
||||
<script type="text/x-handlebars" id="components/dataset-access">
|
||||
{{#if hasAccess}}
|
||||
{{#each accessibilities as |accessibility|}}
|
||||
<h4>Partition By: {{accessibility.partition}}</h4>
|
||||
<table id="references-table" class="columntreegrid tree table table-bordered dataset-detail-table">
|
||||
<thead>
|
||||
<tr class="results-header">
|
||||
<th>Time</th>
|
||||
{{#each accessibility.instanceList as |instance|}}
|
||||
<th>{{instance}}</th>
|
||||
{{/each}}
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{#each accessibility.accessibilityList as |access|}}
|
||||
<tr>
|
||||
<td>{{access.dataTimeExpr}}</td>
|
||||
{{#each access.itemList as |item|}}
|
||||
<td>
|
||||
{{#unless item.isPlaceHolder}}
|
||||
<div>
|
||||
<p>Log time: {{item.logTimeEpochStr}}</p>
|
||||
<p>Record count: {{item.recordCountStr}}</p>
|
||||
</div>
|
||||
{{/unless}}
|
||||
</td>
|
||||
{{/each}}
|
||||
</tr>
|
||||
{{/each}}
|
||||
</tbody>
|
||||
</table>
|
||||
{{/each}}
|
||||
{{else}}
|
||||
<p>Accessibility is not available</p>
|
||||
{{/if}}
|
||||
</script>
|
||||
|
||||
<script type="text/x-handlebars" id="components/metric-detail">
|
||||
<div id="metric" class="container-fluid">
|
||||
<div class="row-fluid">
|
||||
@ -932,6 +969,13 @@
|
||||
Relations
|
||||
</a>
|
||||
</li>
|
||||
<li id="access">
|
||||
<a data-toggle="tab"
|
||||
title="Accessibilities"
|
||||
href="#accesstab">
|
||||
Accessibilities
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="tab-content">
|
||||
{{#unless isPinot}}
|
||||
@ -966,6 +1010,10 @@
|
||||
{{#dataset-relations hasDepends=hasDepends depends=depends hasReferences=hasReferences references=references}}
|
||||
{{/dataset-relations}}
|
||||
</div>
|
||||
<div id="accesstab" class="tab-pane">
|
||||
{{#dataset-access hasAccess=hasAccess accessibilities=accessibilities}}
|
||||
{{/dataset-access}}
|
||||
</div>
|
||||
</div>
|
||||
{{else}}
|
||||
<div class="panel-group" id="accordion" role="tablist" aria-multiselectable="true">
|
||||
@ -1094,6 +1142,23 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading" role="tab" id="accessHeading">
|
||||
<h4 class="panel-title">
|
||||
<a class="collapsed" data-toggle="collapse" data-parent="#accordion"
|
||||
href="#accessview" aria-expanded="false" aria-controls="accessData">
|
||||
Accessiblities
|
||||
</a>
|
||||
</h4>
|
||||
</div>
|
||||
<div id="accessview" class="panel-collapse collapse" role="tabpanel" aria-labelledby="accessHeading">
|
||||
<div class="panel-body">
|
||||
{{#dataset-access hasAccess=hasAccess accessibilities=accessibilities}}
|
||||
{{/dataset-access}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{/if}}
|
||||
</script>
|
||||
|
||||
@ -71,6 +71,10 @@ GET /api/v1/datasets/:id/depends controllers.api.v1.Dataset.getDepend
|
||||
|
||||
GET /api/v1/datasets/:id/references controllers.api.v1.Dataset.getReferenceViews(id:Long)
|
||||
|
||||
GET /api/v1/datasets/:id/partitions controllers.api.v1.Dataset.getDatasetPartitions(id:Long)
|
||||
|
||||
GET /api/v1/datasets/:id/access controllers.api.v1.Dataset.getDatasetAccess(id:Long)
|
||||
|
||||
GET /api/v1/datasets/:id/properties controllers.api.v1.Dataset.getDatasetPropertiesByID(id:Int)
|
||||
|
||||
GET /api/v1/datasets/:id/sample controllers.api.v1.Dataset.getDatasetSampleDataByID(id:Int)
|
||||
|
||||
@ -130,6 +130,9 @@ App.DatasetSchemaComponent = Ember.Component.extend({
|
||||
App.DatasetSampleComponent = Ember.Component.extend({
|
||||
});
|
||||
|
||||
App.DatasetAccessComponent = Ember.Component.extend({
|
||||
});
|
||||
|
||||
App.DatasetImpactComponent = Ember.Component.extend({
|
||||
});
|
||||
|
||||
|
||||
@ -516,6 +516,23 @@ App.DatasetRoute = Ember.Route.extend({
|
||||
}
|
||||
});
|
||||
|
||||
var datasetPartitionsUrl = 'api/v1/datasets/' + id + "/access";
|
||||
var datasetAccessibilities = [];
|
||||
$.get(datasetPartitionsUrl, function(data) {
|
||||
if (data && data.status == "ok")
|
||||
{
|
||||
if (data.access && (data.access.length > 0))
|
||||
{
|
||||
controller.set("hasAccess", true);
|
||||
controller.set("accessibilities", data.access);
|
||||
}
|
||||
else
|
||||
{
|
||||
controller.set("hasAccess", false);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
var datasetReferencesUrl = 'api/v1/datasets/' + id + "/references";
|
||||
$.get(datasetReferencesUrl, function(data) {
|
||||
if (data && data.status == "ok")
|
||||
|
||||
@ -142,6 +142,12 @@ public class ControllersTest {
|
||||
JsonNode schemaTextNode = Json.parse(contentAsString(result));
|
||||
assertThat(schemaTextNode.isContainerNode());
|
||||
assertThat(schemaTextNode.get("status").asText()).isEqualTo("ok");
|
||||
|
||||
result = controllers.api.v1.Dataset.getDatasetAccess(datasetId)
|
||||
assertThat(status(result)).isEqualTo(OK);
|
||||
JsonNode accessNode = Json.parse(contentAsString(result));
|
||||
assertThat(accessNode.isContainerNode());
|
||||
assertThat(accessNode.get("status").asText()).isEqualTo("ok");
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user