| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611 |
- /*
- 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 cookie_schema_browser_autoload = 'schema-browser_autoload';
- solrAdminApp.controller('SchemaController',
- function($scope, $routeParams, $location, $cookies, $timeout, Luke, Constants, Schema, Config) {
- $scope.resetMenu("schema", Constants.IS_COLLECTION_PAGE);
- $scope.refresh = function () {
- Luke.schema({core: $routeParams.core}, function (schema) {
- Luke.raw({core: $routeParams.core}, function (index) {
- var data = mergeIndexAndSchemaData(index, schema.schema);
- $scope.fieldsAndTypes = getFieldsAndTypes(data);
- $scope.is = {};
- var search = $location.search();
- leftbar = {};
- $scope.isField = $scope.isDynamicField = $scope.isType = false;
- $scope.showing = true;
- if (search.field) {
- $scope.selectedType = "Field";
- $scope.is.field = true;
- $scope.name = search.field;
- leftbar.fields = [$scope.name];
- var field = data.fields[$scope.name];
- leftbar.types = [field.type];
- if (field.dynamicBase) leftbar.dynamicFields = [field.dynamicBase];
- if (field.copySources && field.copySources.length>0) {
- leftbar.copyFieldSources = sortedObjectArray(field.copySources.sort());
- }
- if (field.copyDests && field.copyDests.length>0) {
- leftbar.copyFieldDests = sortedObjectArray(field.copyDests.sort());
- }
- $scope.fieldOrType = "field=" + $scope.name;
- } else if (search["dynamic-field"]) {
- $scope.selectedType = "Dynamic Field";
- $scope.is.dynamicField = true;
- $scope.name = search["dynamic-field"];
- leftbar.dynamicFields = [$scope.name];
- leftbar.types = [data.dynamic_fields[$scope.name].type];
- $scope.fieldOrType = "dynamic-field=" + $scope.name;
- } else if (search.type) {
- $scope.selectedType = "Type";
- $scope.is.type = true;
- $scope.name = search.type;
- leftbar.types = [$scope.name];
- leftbar.fields = filterFields("fields", data, $scope.name);
- leftbar.dynamicFields = filterFields("dynamic_fields", data, $scope.name);
- $scope.fieldOrType = "type=" + $scope.name;
- } else {
- $scope.showing = false;
- }
- $scope.leftbar = leftbar;
- $scope.core = $routeParams.core;
- $scope.uniqueKeyField = data.unique_key_field;
- $scope.similarity = data.similarity;
- if ($scope.similarity && $scope.similarity.className) {
- $scope.similarity.className = shortenPackages($scope.similarity.className);
- }
- $scope.isUniqueKeyField = ($scope.selectedType == "Field" && $scope.name == $scope.uniqueKeyField);
- $scope.display = getFieldProperties(data, $routeParams.core, $scope.is, $scope.name);
- $scope.analysis = getAnalysisInfo(data, $scope.is, $scope.name);
- $scope.isAutoload = $cookies[cookie_schema_browser_autoload] == "true";
- if ($scope.isAutoload) {
- $scope.toggleTerms();
- }
- $scope.types = Object.keys(schema.schema.types);
- });
- });
- Config.get({core: $routeParams.core}, function(data) {
- $scope.isSchemaUpdatable = (data.config.hasOwnProperty('schemaFactory') == false || data.config.schemaFactory.class == "ManagedIndexSchemaFactory");
- });
- };
- $scope.refresh();
- $scope.selectFieldOrType = function() {
- $location.search($scope.fieldOrType);
- }
- $scope.toggleAnalyzer = function(analyzer) {
- analyzer.show = !analyzer.show;
- }
- $scope.loadTermInfo = function() {
- var params = {fl: $scope.name, core: $routeParams.core};
- if ($scope.topTermsCount) {
- params.numTerms = $scope.topTermsCount;
- }
- $scope.isLoadingTerms = true;
- Luke.field(params, function (data) {
- $scope.isLoadingTerms = false;
- $scope.termInfo = getTermInfo(data.fields[$scope.name]);
- if (!$scope.topTermsCount) {
- $scope.topTermsCount = $scope.termInfo.termCount;
- }
- });
- }
- $scope.toggleTerms = function() {
- $scope.showTerms = !$scope.showTerms;
- if ($scope.showTerms) {
- $scope.loadTermInfo();
- }
- }
- $scope.loadAllTerms = function() {
- $scope.topTermsCount = $scope.termInfo.maxTerms;
- $scope.loadTermInfo();
- }
- $scope.toggleAutoload = function() {
- $scope.isAutoload = !$scope.isAutoload;
- $cookies[cookie_schema_browser_autoload] = $scope.isAutoload;
- console.log("cookie: " + $cookies[cookie_schema_browser_autoload]);
- }
- $scope.hideAll = function() {
- $scope.showAddField = false;
- $scope.showAddDynamicField = false;
- $scope.showAddCopyField = false;
- }
- $scope.toggleAddField = function() {
- if ($scope.showAddField && $scope.adding == "field") {
- $scope.hideAll();
- } else {
- $scope.hideAll();
- $scope.showAddField = true;
- $scope.adding = "field";
- $scope.newField = {
- stored: "true",
- indexed: "true",
- uninvertible: "true"
- }
- delete $scope.addErrors;
- }
- }
- $scope.addField = function() {
- delete $scope.addErrors;
- var data = {"add-field": $scope.newField};
- Schema.post({core: $routeParams.core}, data, function(data) {
- if (data.errors) {
- $scope.addErrors = data.errors[0].errorMessages;
- if (typeof $scope.addErrors === "string") {
- $scope.addErrors = [$scope.addErrors];
- }
- } else {
- $scope.added = true;
- $timeout(function() {
- $scope.showAddField = false;
- $scope.added = false;
- $scope.refresh();
- }, 1500);
- }
- });
- }
- $scope.toggleAddDynamicField = function() {
- if ($scope.showAddField && $scope.adding == "dynamicField") {
- $scope.hideAll();
- } else {
- $scope.hideAll();
- $scope.showAddField = true;
- $scope.adding = "dynamicField";
- $scope.newField = {
- stored: "true",
- indexed: "true"
- }
- delete $scope.addErrors;
- }
- }
- $scope.addDynamicField = function() {
- delete $scope.addErrors;
- var data = {"add-dynamic-field": $scope.newField};
- Schema.post({core: $routeParams.core}, data, function(data) {
- if (data.errors) {
- $scope.addErrors = data.errors[0].errorMessages;
- if (typeof $scope.addErrors === "string") {
- $scope.addErrors = [$scope.addErrors];
- }
- } else {
- $scope.added = true;
- $timeout(function() {
- $scope.showAddField = false;
- $scope.added = false;
- $scope.refresh();
- }, 1500);
- }
- });
- }
- $scope.toggleAddCopyField = function() {
- if ($scope.showAddCopyField) {
- $scope.hideAll();
- } else {
- $scope.hideAll();
- $scope.showAddCopyField = true;
- $scope.copyField = {};
- delete $scope.addCopyFieldErrors;
- }
- }
- $scope.addCopyField = function() {
- delete $scope.addCopyFieldErrors;
- var data = {"add-copy-field": $scope.copyField};
- Schema.post({core: $routeParams.core}, data, function(data) {
- if (data.errors) {
- $scope.addCopyFieldErrors = data.errors[0].errorMessages;
- if (typeof $scope.addCopyFieldErrors === "string") {
- $scope.addCopyFieldErrors = [$scope.addCopyFieldErrors];
- }
- } else {
- $scope.showAddCopyField = false;
- $timeout($scope.refresh, 1500);
- }
- });
- }
- $scope.toggleDelete = function() {
- if ($scope.showDelete) {
- $scope.showDelete = false;
- } else {
- if ($scope.is.field) {
- $scope.deleteData = {'delete-field': {name: $scope.name}};
- } else if ($scope.is.dynamicField) {
- $scope.deleteData = {'delete-dynamic-field': {name: $scope.name}};
- } else {
- alert("TYPE NOT KNOWN");
- }
- $scope.showDelete = true;
- }
- }
- $scope.delete = function() {
- Schema.post({core: $routeParams.core}, $scope.deleteData, function(data) {
- if (data.errors) {
- $scope.deleteErrors = data.errors[0].errorMessages;
- if (typeof $scope.deleteErrors === "string") {
- $scope.deleteErrors = [$scope.deleteErrors];
- }
- } else {
- $scope.deleted = true;
- $timeout(function() {
- $location.search("");
- }, 1500
- );
- }
- });
- }
- $scope.toggleDeleteCopyField = function(field) {
- field.show = !field.show;
- delete field.errors;
- }
- $scope.deleteCopyField = function(field, source, dest) {
- data = {'delete-copy-field': {source: source, dest: dest}};
- Schema.post({core: $routeParams.core}, data, function(data) {
- if (data.errors) {
- field.errors = data.errors[0].errorMessages;
- if (typeof $scope.deleteErrors === "string") {
- field.errors = [field.errors];
- }
- } else {
- field.deleted = true;
- $timeout($scope.refresh, 1500);
- }
- });
- }
- }
- );
- var getFieldsAndTypes = function(data) {
- var fieldsAndTypes = [];
- var fields = Object.keys(data.fields).sort();
- for (var i in fields) {
- fieldsAndTypes.push({
- group: "Fields",
- value: "field=" + fields[i],
- label: fields[i]
- });
- }
- var dynamic_fields = Object.keys(data.dynamic_fields).sort();
- for (var i in dynamic_fields) {
- fieldsAndTypes.push({
- group: "Dynamic Fields",
- value: "dynamic-field=" + dynamic_fields[i],
- label: dynamic_fields[i]
- });
- }
- var types = Object.keys(data.types).sort();
- for (var i in types) {
- fieldsAndTypes.push({
- group: "Types",
- value: "type=" + types[i],
- label: types[i]
- });
- }
- return fieldsAndTypes;
- };
- var filterFields = function(type, data, name) {
- var fields = [];
- for (var i in data.types[name].fields) {
- var field = data.types[name].fields[i];
- if (data[type][field]) {
- fields.push(field)
- }
- }
- return fields.sort();
- }
- var mergeIndexAndSchemaData = function(index, schema) {
- var data = {
- unique_key_field: null,
- similarity: null,
- key: {},
- fields: {},
- dynamic_fields: {},
- types: {},
- relations: {
- f_df: {},
- f_t: {},
- df_f: {},
- df_t: {},
- t_f: {},
- t_df: {}
- }
- };
- data.fields = index.fields;
- data.key = index.info.key;
- data.unique_key_field = schema.uniqueKeyField;
- data.similarity = schema.similarity;
- data.dynamic_fields = schema.dynamicFields;
- data.types = schema.types;
- for (var field in schema.fields) {
- data.fields[field] =
- $.extend({}, data.fields[field], schema.fields[field]);
- }
- for (var field in data.fields) {
- var copy_dests = data.fields[field].copyDests;
- for (var i in copy_dests) {
- var copy_dest = copy_dests[i];
- if (!data.fields[copy_dest]) {
- data.fields[copy_dest] = {
- partial: true,
- copySources: []
- };
- }
- if (data.fields[copy_dest].partial) {
- data.fields[copy_dest].copySources.push(field);
- }
- }
- var copy_sources = data.fields[field].copySources;
- for (var i in copy_sources) {
- var copy_source = copy_sources[i];
- if (!data.fields[copy_source]) {
- data.fields[copy_source] = {
- partial: true,
- copyDests: []
- };
- }
- if (data.fields[copy_source].partial) {
- data.fields[copy_source].copyDests.push(field);
- }
- }
- data.relations.f_t[field] = data.fields[field].type;
- if (!data.relations.t_f[data.fields[field].type]) {
- data.relations.t_f[data.fields[field].type] = [];
- }
- data.relations.t_f[data.fields[field].type].push(field);
- if (data.fields[field].dynamicBase) {
- data.relations.f_df[field] = data.fields[field].dynamicBase;
- if (!data.relations.df_f[data.fields[field].dynamicBase]) {
- data.relations.df_f[data.fields[field].dynamicBase] = [];
- }
- data.relations.df_f[data.fields[field].dynamicBase].push(field);
- }
- }
- for (var dynamic_field in data.dynamic_fields) {
- data.relations.df_t[dynamic_field] = data.dynamic_fields[dynamic_field].type;
- if (!data.relations.t_df[data.dynamic_fields[dynamic_field].type]) {
- data.relations.t_df[data.dynamic_fields[dynamic_field].type] = [];
- }
- data.relations.t_df[data.dynamic_fields[dynamic_field].type].push(dynamic_field);
- }
- return data;
- };
- var getFieldProperties = function(data, core, is, name) {
- var display = {};
- display.partialState = is.field && !!data.fields[name].partial;
- display.columns = [];
- display.rows = [];
- var allFlags = "";
- var addRow = function(name, flags) {
- if (flags[0]!='(') {
- display.rows.push({name:name, flags:flags});
- for (var i in flags) {
- if (flags[i]!="-" && allFlags.indexOf(flags[i])<0) {
- allFlags+=flags[i];
- }
- }
- } else {
- display.rows.push({name:name, comment:flags});
- }
- }
- // Identify the rows for our field property table
- if (is.field && data.fields[name]) {
- if (data.fields[name].flags) {
- addRow('Properties', data.fields[name].flags);
- }
- if (data.fields[name].schema) {
- addRow('Schema', data.fields[name].schema);
- }
- if (data.fields[name].index) {
- addRow('Index', data.fields[name].index);
- }
- display.docs = data.fields[name].docs;
- display.docsUrl = "#/" + core + "/query?q=" + name + ":[* TO *]";
- display.distinct = data.fields[name].distinct;
- display.positionIncrementGap = data.fields[name].positionIncrementGap;
- if (data.types[data.fields[name].type]) {
- display.similarity = data.types[data.fields[name].type].similarity;
- } else {
- display.similarity = null;
- }
- } else if (is.dynamicField && data.dynamic_fields[name] && data.dynamic_fields[name].flags) {
- addRow('Properties', data.dynamic_fields[name].flags);
- display.similarity = data.types[data.dynamic_fields[name].type].similarity;
- } else if (is.type && data.types[name]) {
- display.similarity = data.types[name].similarity;
- }
- if (display.similarity && display.similarity.className) {
- display.similarity.className = shortenPackages(display.similarity.className);
- }
- // identify columns in field property table:
- for (var key in data.key) {
- if (allFlags.indexOf(key)>=0) {
- display.columns.push({key: key, name: data.key[key]});
- }
- }
- // identify rows and cell values in field property table:
- for (var i in display.rows) {
- var row = display.rows[i];
- row.cells = [];
- if (!row.flags) {
- continue; // Match the special case in the LukeRequestHandler
- }
- for (var j in display.columns) {
- var flag = display.columns[j].key;
- row.cells.push({key: flag, value: row.flags.indexOf(flag)>=0});
- }
- }
- return display;
- };
- var getAnalysisInfo = function(data, is, name) {
- var analysis = {};
- if (is.field) {
- var type = data.relations.f_t[name];
- analysis.query = "analysis.fieldname=" + name;
- }
- else if (is.dynamicField) {
- var type = data.relations.df_t[name];
- analysis.query = "analysis.fieldtype=" + type;
- }
- else if (is.type) {
- var type = name;
- analysis.query = "analysis.fieldtype=" + name;
- }
- var processComponentType = function (label, key, componentTypeData) {
- if (componentTypeData) {
- var components = [];
- for (var componentName in componentTypeData) {
- var componentData = componentTypeData[componentName];
- var component = {className: componentData.className, args:[]};
- if (componentData.args) {
- for (var argName in componentData.args) {
- var argValue = componentData.args[argName];
- if (argValue == "1" || argValue == "true") {
- component.args.push({name: argName, booleanValue:true});
- } else if (argValue == "0" || argValue == "false") {
- component.args.push({name: argName, booleanValue:false});
- } else {
- component.args.push({name: argName, value:argValue});
- }
- }
- }
- components.push(component);
- }
- return {label: label, key: key, components: components};
- } else {
- return {label: label, key: key};
- }
- }
- var buildAnalyzer = function (analyzerData) {
- var analyzer = {};
- analyzer.className = analyzerData.className;
- analyzer.componentTypes = [];
- if (analyzerData.tokenizer) {
- analyzer.componentTypes.push(processComponentType("Char Filters", "charFilters", analyzerData.charFilters));
- analyzer.componentTypes.push(processComponentType("Tokenizer", "tokenizer", {tokenizer: analyzerData.tokenizer}));
- analyzer.componentTypes.push(processComponentType("Token Filters", "tokenFilters", analyzerData.filters));
- }
- return analyzer;
- }
- analysis.data = data.types[type];
- if (analysis.data) {
- analysis.analyzers = [
- {key: "index", name: "Index", detail: buildAnalyzer(analysis.data.indexAnalyzer)},
- {key: "query", name: "Query", detail: buildAnalyzer(analysis.data.queryAnalyzer)}
- ];
- }
- return analysis;
- }
- var getTermInfo = function(data) {
- var termInfo = {};
- if (data && data.topTerms) {
- termInfo.topTerms = [];
- var currentGroup = {count: 0}
- for (var i = 0; i < data.topTerms.length; i += 2) {
- var count = data.topTerms[i + 1];
- if (currentGroup.count != count) {
- currentGroup = {count: count, terms: []};
- termInfo.topTerms.push(currentGroup);
- }
- currentGroup.terms.push(data.topTerms[i]);
- }
- termInfo.termCount = data.topTerms.length / 2;
- termInfo.maxTerms = data.distinct;
- }
- if(data && data.histogram) {
- termInfo.histogram = [];
- termInfo.histogramMax = 0;
- for (var i = 0; i < data.histogram.length; i += 2) {
- termInfo.histogram.push({key: data.histogram[i], value: data.histogram[i + 1]});
- termInfo.histogramMax = Math.max(termInfo.histogramMax, data.histogram[i + 1]);
- }
- }
- return termInfo;
- };
- var sortedObjectArray = function(list) {
- var objarr = [];
- for (var i in list) {
- objarr.push({"name": list[i]});
- }
- return objarr;
- };
- var shortenPackages = function(className) {
- return className.replace("org.apache.solr", "o.a.s").replace("org.apache.lucene", "o.a.l");
- };
|