mirror of https://github.com/apache/lucene.git
303 lines
11 KiB
JavaScript
303 lines
11 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.
|
|
*/
|
|
|
|
var dataimport_timeout = 2000;
|
|
|
|
solrAdminApp.controller('DataImportController',
|
|
function($scope, $rootScope, $routeParams, $location, $timeout, $interval, $cookies, Mbeans, DataImport, Constants) {
|
|
$scope.resetMenu("dataimport", Constants.IS_COLLECTION_PAGE);
|
|
|
|
$scope.refresh = function () {
|
|
Mbeans.info({core: $routeParams.core, cat: 'QUERY'}, function (data) {
|
|
var mbeans = data['solr-mbeans'][1];
|
|
$scope.handlers = [];
|
|
for (var key in mbeans) {
|
|
if (mbeans[key]['class'] !== key && mbeans[key]['class'] === 'org.apache.solr.handler.dataimport.DataImportHandler') {
|
|
$scope.handlers.push(key);
|
|
}
|
|
}
|
|
$scope.hasHandlers = $scope.handlers.length > 0;
|
|
|
|
if (!$routeParams.handler) {
|
|
$location.path("/" + $routeParams.core + "/dataimport/" + $scope.handlers[0]);
|
|
} else {
|
|
$scope.currentHandler = $routeParams.handler;
|
|
}
|
|
});
|
|
|
|
$scope.handler = $routeParams.handler;
|
|
if ($scope.handler && $scope.handler[0]=="/") {
|
|
$scope.handler = $scope.handler.substr(1);
|
|
}
|
|
if ($scope.handler) {
|
|
DataImport.config({core: $routeParams.core, name: $scope.handler}, function (data) {
|
|
try {
|
|
$scope.config = data.config;
|
|
var xml = $.parseXML(data.config);
|
|
$scope.entities = [];
|
|
$('document > entity', xml).each(function (i, element) {
|
|
$scope.entities.push($(element).attr('name'));
|
|
});
|
|
$scope.refreshStatus();
|
|
} catch (err) {
|
|
console.log(err);
|
|
}
|
|
});
|
|
}
|
|
$scope.lastUpdate = "unknown";
|
|
$scope.lastUpdateUTC = "";
|
|
};
|
|
|
|
$scope.toggleDebug = function () {
|
|
$scope.isDebugMode = !$scope.isDebugMode;
|
|
if ($scope.isDebugMode) {
|
|
// also enable Debug checkbox
|
|
$scope.form.showDebug = true;
|
|
}
|
|
$scope.showConfiguration = true;
|
|
}
|
|
|
|
$scope.toggleConfiguration = function () {
|
|
$scope.showConfiguration = !$scope.showConfiguration;
|
|
}
|
|
|
|
$scope.toggleRawStatus = function () {
|
|
$scope.showRawStatus = !$scope.showRawStatus;
|
|
}
|
|
|
|
$scope.toggleRawDebug = function () {
|
|
$scope.showRawDebug = !$scope.showRawDebug;
|
|
}
|
|
|
|
$scope.reload = function () {
|
|
DataImport.reload({core: $routeParams.core, name: $scope.handler}, function () {
|
|
$scope.reloaded = true;
|
|
$timeout(function () {
|
|
$scope.reloaded = false;
|
|
}, 5000);
|
|
$scope.refresh();
|
|
});
|
|
}
|
|
|
|
$scope.form = {
|
|
command: "full-import",
|
|
verbose: false,
|
|
clean: false,
|
|
commit: true,
|
|
showDebug: false,
|
|
custom: "",
|
|
core: $routeParams.core
|
|
};
|
|
|
|
$scope.submit = function () {
|
|
var params = {};
|
|
for (var key in $scope.form) {
|
|
if (key == "showDebug") {
|
|
if ($scope.form.showDebug) {
|
|
params["debug"] = true;
|
|
}
|
|
} else {
|
|
params[key] = $scope.form[key];
|
|
}
|
|
}
|
|
if (params.custom.length) {
|
|
var customParams = $scope.form.custom.split("&");
|
|
for (var i in customParams) {
|
|
var parts = customParams[i].split("=");
|
|
params[parts[0]] = parts[1];
|
|
}
|
|
}
|
|
delete params.custom;
|
|
|
|
if ($scope.isDebugMode) {
|
|
params.dataConfig = $scope.config;
|
|
}
|
|
|
|
params.core = $routeParams.core;
|
|
params.name = $scope.handler;
|
|
|
|
DataImport.post(params, function (data) {
|
|
$scope.rawResponse = JSON.stringify(data, null, 2);
|
|
$scope.refreshStatus();
|
|
});
|
|
};
|
|
|
|
$scope.abort = function () {
|
|
$scope.isAborting = true;
|
|
DataImport.abort({core: $routeParams.core, name: $scope.handler}, function () {
|
|
$timeout(function () {
|
|
$scope.isAborting = false;
|
|
$scope.refreshStatus();
|
|
}, 4000);
|
|
});
|
|
}
|
|
|
|
$scope.refreshStatus = function () {
|
|
|
|
console.log("Refresh Status");
|
|
|
|
$scope.isStatusLoading = true;
|
|
DataImport.status({core: $routeParams.core, name: $scope.handler}, function (data) {
|
|
if (data[0] == "<") {
|
|
$scope.hasHandlers = false;
|
|
return;
|
|
}
|
|
|
|
var now = new Date();
|
|
$scope.lastUpdate = now.toTimeString().split(' ').shift();
|
|
$scope.lastUpdateUTC = now.toUTCString();
|
|
var messages = data.statusMessages;
|
|
var messagesCount = 0;
|
|
for( var key in messages ) { messagesCount++; }
|
|
|
|
if (data.status == 'busy') {
|
|
$scope.status = "indexing";
|
|
|
|
$scope.timeElapsed = data.statusMessages['Time Elapsed'];
|
|
$scope.elapsedSeconds = parseSeconds($scope.timeElapsed);
|
|
|
|
var info = $scope.timeElapsed ? 'Indexing since ' + $scope.timeElapsed : 'Indexing ...';
|
|
$scope.info = showInfo(messages, true, info, $scope.elapsedSeconds);
|
|
|
|
} else if (messages.RolledBack) {
|
|
$scope.status = "failure";
|
|
$scope.info = showInfo(messages, true);
|
|
} else if (messages.Aborted) {
|
|
$scope.status = "aborted";
|
|
$scope.info = showInfo(messages, true, 'Aborting current Import ...');
|
|
} else if (data.status == "idle" && messagesCount != 0) {
|
|
$scope.status = "success";
|
|
$scope.info = showInfo(messages, true);
|
|
} else {
|
|
$scope.status = "idle";
|
|
$scope.info = showInfo(messages, false, 'No information available (idle)');
|
|
}
|
|
|
|
delete data.$promise;
|
|
delete data.$resolved;
|
|
|
|
$scope.rawStatus = JSON.stringify(data, null, 2);
|
|
|
|
$scope.isStatusLoading = false;
|
|
$scope.statusUpdated = true;
|
|
$timeout(function () {
|
|
$scope.statusUpdated = false;
|
|
}, dataimport_timeout / 2);
|
|
});
|
|
};
|
|
|
|
$scope.updateAutoRefresh = function () {
|
|
$scope.autorefresh = !$scope.autorefresh;
|
|
$cookies.dataimport_autorefresh = $scope.autorefresh ? true : null;
|
|
if ($scope.autorefresh) {
|
|
$scope.refreshTimeout = $interval($scope.refreshStatus, dataimport_timeout);
|
|
var onRouteChangeOff = $scope.$on('$routeChangeStart', function() {
|
|
$interval.cancel($scope.refreshTimeout);
|
|
onRouteChangeOff();
|
|
});
|
|
|
|
} else if ($scope.refreshTimeout) {
|
|
$interval.cancel($scope.refreshTimeout);
|
|
}
|
|
$scope.refreshStatus();
|
|
};
|
|
|
|
$scope.refresh();
|
|
|
|
});
|
|
|
|
var showInfo = function (messages, showFull, info_text, elapsed_seconds) {
|
|
|
|
var info = {};
|
|
if (info_text) {
|
|
info.text = info_text;
|
|
} else {
|
|
info.text = messages[''] || '';
|
|
// format numbers included in status nicely
|
|
/* @todo this pretty printing is hard to work out how to do in an Angularesque way:
|
|
info.text = info.text.replace(/\d{4,}/g,
|
|
function (match, position, string) {
|
|
return app.format_number(parseInt(match, 10));
|
|
}
|
|
);
|
|
*/
|
|
|
|
var time_taken_text = messages['Time taken'];
|
|
info.timeTaken = parseSeconds(time_taken_text);
|
|
}
|
|
info.showDetails = false;
|
|
|
|
if (showFull) {
|
|
if (!elapsed_seconds) {
|
|
var time_taken_text = messages['Time taken'];
|
|
elapsed_seconds = parseSeconds(time_taken_text);
|
|
}
|
|
|
|
info.showDetails = true;
|
|
|
|
var document_config = {
|
|
'Requests': 'Total Requests made to DataSource',
|
|
'Fetched': 'Total Rows Fetched',
|
|
'Skipped': 'Total Documents Skipped',
|
|
'Processed': 'Total Documents Processed'
|
|
};
|
|
|
|
info.docs = [];
|
|
for (var key in document_config) {
|
|
var value = parseInt(messages[document_config[key]], 10);
|
|
var doc = {desc: document_config[key], name: key, value: value};
|
|
if (elapsed_seconds && key != 'Skipped') {
|
|
doc.speed = Math.round(value / elapsed_seconds);
|
|
}
|
|
info.docs.push(doc);
|
|
}
|
|
|
|
var dates_config = {
|
|
'Started': 'Full Dump Started',
|
|
'Aborted': 'Aborted',
|
|
'Rolledback': 'Rolledback'
|
|
};
|
|
|
|
info.dates = [];
|
|
for (var key in dates_config) {
|
|
var value = messages[dates_config[key]];
|
|
if (value) {
|
|
value = value.replace(" ", "T")+".000Z";
|
|
console.log(value);
|
|
var date = {desc: dates_config[key], name: key, value: value};
|
|
info.dates.push(date);
|
|
}
|
|
}
|
|
}
|
|
return info;
|
|
}
|
|
|
|
var parseSeconds = function(time) {
|
|
var seconds = 0;
|
|
var arr = new String(time || '').split('.');
|
|
var parts = arr[0].split(':').reverse();
|
|
|
|
for (var i = 0; i < parts.length; i++) {
|
|
seconds += ( parseInt(parts[i], 10) || 0 ) * Math.pow(60, i);
|
|
}
|
|
|
|
if (arr[1] && 5 <= parseInt(arr[1][0], 10)) {
|
|
seconds++; // treat more or equal than .5 as additional second
|
|
}
|
|
return seconds;
|
|
}
|