mirror of https://github.com/apache/lucene.git
240 lines
6.1 KiB
JavaScript
240 lines
6.1 KiB
JavaScript
/*
|
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
|
contributor license agreements. See the NOTICE file distributed with
|
|
this work for additional information regarding copyright ownership.
|
|
The ASF licenses this file to You 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.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
solrAdminApp.controller('StreamController',
|
|
function($scope, $routeParams, $location, Query, Constants) {
|
|
|
|
$scope.resetMenu("stream", Constants.IS_COLLECTION_PAGE);
|
|
|
|
$scope.stream = {
|
|
wt: 'json',
|
|
expr: $scope.expr,
|
|
indent: 'on'
|
|
};
|
|
$scope.qt = "stream";
|
|
$scope.doExplanation = false
|
|
|
|
$scope.doStream = function() {
|
|
|
|
var params = {};
|
|
params.core = $routeParams.core;
|
|
params.handler = $scope.qt;
|
|
params.expr = [$scope.expr]
|
|
if($scope.doExplanation){
|
|
params.explain = [$scope.doExplanation]
|
|
}
|
|
|
|
$scope.lang = "json";
|
|
$scope.response = null;
|
|
$scope.url = "";
|
|
|
|
var url = Query.url(params);
|
|
|
|
Query.query(params, function(data) {
|
|
|
|
var jsonData = JSON.parse(data.toJSON().data);
|
|
if (undefined != jsonData["explanation"]) {
|
|
$scope.showExplanation = true;
|
|
|
|
streamGraphSubController($scope, jsonData["explanation"])
|
|
delete jsonData["explanation"]
|
|
} else {
|
|
$scope.showExplanation = false;
|
|
}
|
|
|
|
data.data = JSON.stringify(jsonData,null,2);
|
|
|
|
$scope.lang = "json";
|
|
$scope.response = data;
|
|
$scope.url = url;
|
|
$scope.hostPortContext = $location.absUrl().substr(0,$location.absUrl().indexOf("#")); // For display only
|
|
|
|
});
|
|
};
|
|
|
|
if ($location.search().expr) {
|
|
$scope.expr = $location.search()["expr"];
|
|
$scope.doStream();
|
|
}
|
|
|
|
}
|
|
);
|
|
|
|
var streamGraphSubController = function($scope, explanation) {
|
|
$scope.showGraph = true;
|
|
$scope.pos = 0;
|
|
$scope.rows = 8;
|
|
|
|
$scope.resetGraph = function() {
|
|
$scope.pos = 0;
|
|
$scope.initGraph();
|
|
}
|
|
|
|
$scope.initGraph = function(explanation) {
|
|
|
|
data = explanation
|
|
|
|
var leafCount = 0;
|
|
var maxDepth = 0;
|
|
var rootNode = {};
|
|
|
|
leafCount = 0;
|
|
|
|
let recurse = function(dataNode, depth) {
|
|
|
|
if (depth > maxDepth) {
|
|
maxDepth = depth;
|
|
}
|
|
|
|
let graphNode = {
|
|
name: dataNode.expressionNodeId,
|
|
implementingClass: 'unknown',
|
|
data: {}
|
|
};
|
|
|
|
["expressionNodeId", "expressionType", "functionName", "implementingClass", "expression", "note", "helpers"].forEach(function(key) {
|
|
graphNode.data[key] = dataNode[key];
|
|
});
|
|
|
|
if (dataNode.children && dataNode.children.length > 0) {
|
|
graphNode.children = [];
|
|
dataNode.children.forEach(function(n) {
|
|
graphNode.children.push(recurse(n, depth + 1));
|
|
});
|
|
} else {
|
|
++leafCount;
|
|
}
|
|
|
|
return graphNode;
|
|
}
|
|
|
|
$scope.showPaging = false;
|
|
$scope.isRadial = false;
|
|
$scope.explanationData = recurse(data, 1);
|
|
|
|
$scope.depth = maxDepth + 1;
|
|
$scope.leafCount = leafCount;
|
|
};
|
|
|
|
$scope.initGraph(explanation);
|
|
};
|
|
|
|
solrAdminApp.directive('explanationGraph', function(Constants) {
|
|
return {
|
|
restrict: 'EA',
|
|
scope: {
|
|
data: "=",
|
|
leafCount: "=",
|
|
depth: "="
|
|
},
|
|
link: function(scope, element, attrs) {
|
|
|
|
var helper_path_class = function(p) {
|
|
var classes = ['link'];
|
|
|
|
return classes.join(' ');
|
|
};
|
|
|
|
var helper_node_class = function(d) {
|
|
var classes = ['node'];
|
|
|
|
if (d.data && d.data.expressionType) {
|
|
classes.push(d.data.expressionType);
|
|
}
|
|
|
|
return classes.join(' ');
|
|
};
|
|
|
|
var helper_node_text = function(d) {
|
|
if (d.data && d.data.functionName) {
|
|
return d.data.functionName;
|
|
}
|
|
|
|
return d.name
|
|
};
|
|
|
|
var helper_tooltip = function(d) {
|
|
|
|
return [
|
|
"Function: " + d.data.functionName,
|
|
"Type: " + d.data.expressionType,
|
|
"Class: " + d.data.implementingClass.replace("org.apache.solr.client.solrj.io", "o.a.s.c.s.i"),
|
|
"=============",
|
|
d.data.expression
|
|
].join("\n");
|
|
}
|
|
|
|
scope.$watch("data", function(newValue, oldValue) {
|
|
if (newValue) {
|
|
flatGraph(element, scope.data, scope.depth, scope.leafCount);
|
|
}
|
|
});
|
|
|
|
var flatGraph = function(element, graphData, depth, leafCount) {
|
|
var w = 100 + (depth * 100),
|
|
h = leafCount * 40;
|
|
|
|
var tree = d3.layout.tree().size([h, w]);
|
|
|
|
var diagonal = d3.svg.diagonal().projection(function(d) {
|
|
return [d.y * .7, d.x];
|
|
});
|
|
|
|
d3.select('#canvas', element).html('');
|
|
var vis = d3.select('#canvas', element).append('svg')
|
|
.attr('width', w)
|
|
.attr('height', h)
|
|
.append('g')
|
|
.attr('transform', 'translate(25, 0)');
|
|
|
|
var nodes = tree.nodes(graphData);
|
|
|
|
var link = vis.selectAll('path.link')
|
|
.data(tree.links(nodes))
|
|
.enter().append('path')
|
|
.attr('class', helper_path_class)
|
|
.attr('d', diagonal);
|
|
|
|
var node = vis.selectAll('g.node')
|
|
.data(nodes)
|
|
.enter().append('g')
|
|
.attr('class', helper_node_class)
|
|
.attr('transform', function(d) {
|
|
return 'translate(' + d.y * .7 + ',' + d.x + ')';
|
|
})
|
|
|
|
node.append('circle')
|
|
.attr('r', 4.5);
|
|
|
|
node.append('title')
|
|
.text(helper_tooltip);
|
|
|
|
node.append('text')
|
|
.attr('dx', function(d) {
|
|
return 8;
|
|
})
|
|
.attr('dy', function(d) {
|
|
return 5;
|
|
})
|
|
.attr('text-anchor', function(d) {
|
|
return 'start';
|
|
})
|
|
.text(helper_node_text)
|
|
};
|
|
}
|
|
};
|
|
})
|