http://git-wip-us.apache.org/repos/asf/ignite/blob/6af6560a/modules/web-console/src/main/js/controllers/sql-controller.js ---------------------------------------------------------------------- diff --git a/modules/web-console/src/main/js/controllers/sql-controller.js b/modules/web-console/src/main/js/controllers/sql-controller.js deleted file mode 100644 index 7a851c3..0000000 --- a/modules/web-console/src/main/js/controllers/sql-controller.js +++ /dev/null @@ -1,1588 +0,0 @@ -/* - * 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. - */ - -// Controller for SQL notebook screen. -export default ['sqlController', [ - '$rootScope', '$scope', '$http', '$q', '$timeout', '$interval', '$animate', '$location', '$anchorScroll', '$state', '$modal', '$popover', 'IgniteLoading', 'IgniteLegacyUtils', 'IgniteMessages', 'IgniteConfirm', 'IgniteAgentMonitor', 'IgniteChartColors', 'QueryNotebooks', 'uiGridConstants', 'uiGridExporterConstants', - function($root, $scope, $http, $q, $timeout, $interval, $animate, $location, $anchorScroll, $state, $modal, $popover, Loading, LegacyUtils, Messages, Confirm, agentMonitor, IgniteChartColors, QueryNotebooks, uiGridConstants, uiGridExporterConstants) { - let stopTopology = null; - - const _tryStopRefresh = function(paragraph) { - if (paragraph.rate && paragraph.rate.stopTime) { - $interval.cancel(paragraph.rate.stopTime); - - delete paragraph.rate.stopTime; - } - }; - - const _stopTopologyRefresh = () => { - $interval.cancel(stopTopology); - - if ($scope.notebook && $scope.notebook.paragraphs) - $scope.notebook.paragraphs.forEach((paragraph) => _tryStopRefresh(paragraph)); - }; - - $scope.$on('$stateChangeStart', _stopTopologyRefresh); - - $scope.caches = []; - - $scope.pageSizes = [50, 100, 200, 400, 800, 1000]; - - $scope.timeLineSpans = ['1', '5', '10', '15', '30']; - - $scope.aggregateFxs = ['FIRST', 'LAST', 'MIN', 'MAX', 'SUM', 'AVG', 'COUNT']; - - $scope.modes = LegacyUtils.mkOptions(['PARTITIONED', 'REPLICATED', 'LOCAL']); - - $scope.loadingText = $root.IgniteDemoMode ? 'Demo grid is starting. Please wait...' : 'Loading notebook screen...'; - - $scope.timeUnit = [ - {value: 1000, label: 'seconds', short: 's'}, - {value: 60000, label: 'minutes', short: 'm'}, - {value: 3600000, label: 'hours', short: 'h'} - ]; - - $scope.exportDropdown = [ - { text: 'Export all', click: 'exportCsvAll(paragraph)' } - // { 'text': 'Export all to CSV', 'click': 'exportCsvAll(paragraph)' }, - // { 'text': 'Export all to PDF', 'click': 'exportPdfAll(paragraph)' } - ]; - - $scope.metadata = []; - - $scope.metaFilter = ''; - - $scope.metaOptions = { - nodeChildren: 'children', - dirSelectable: true, - injectClasses: { - iExpanded: 'fa fa-minus-square-o', - iCollapsed: 'fa fa-plus-square-o' - } - }; - - $scope.maskCacheName = (cacheName) => _.isEmpty(cacheName) ? '<default>' : cacheName; - - // Time line X axis descriptor. - const TIME_LINE = {value: -1, type: 'java.sql.Date', label: 'TIME_LINE'}; - - // Row index X axis descriptor. - const ROW_IDX = {value: -2, type: 'java.lang.Integer', label: 'ROW_IDX'}; - - // We need max 1800 items to hold history for 30 mins in case of refresh every second. - const HISTORY_LENGTH = 1800; - - const MAX_VAL_COLS = IgniteChartColors.length; - - $anchorScroll.yOffset = 55; - - $scope.chartColor = function(index) { - return {color: 'white', 'background-color': IgniteChartColors[index]}; - }; - - function _chartNumber(arr, idx, dflt) { - if (idx >= 0 && arr && arr.length > idx && _.isNumber(arr[idx])) - return arr[idx]; - - return dflt; - } - - function _min(rows, idx, dflt) { - let min = _chartNumber(rows[0], idx, dflt); - - _.forEach(rows, (row) => { - const v = _chartNumber(row, idx, dflt); - - if (v < min) - min = v; - }); - - return min; - } - - function _max(rows, idx, dflt) { - let max = _chartNumber(rows[0], idx, dflt); - - _.forEach(rows, (row) => { - const v = _chartNumber(row, idx, dflt); - - if (v > max) - max = v; - }); - - return max; - } - - function _sum(rows, idx) { - let sum = 0; - - _.forEach(rows, (row) => sum += _chartNumber(row, idx, 0)); - - return sum; - } - - function _aggregate(rows, aggFx, idx, dflt) { - const len = rows.length; - - switch (aggFx) { - case 'FIRST': - return _chartNumber(rows[0], idx, dflt); - - case 'LAST': - return _chartNumber(rows[len - 1], idx, dflt); - - case 'MIN': - return _min(rows, idx, dflt); - - case 'MAX': - return _max(rows, idx, dflt); - - case 'SUM': - return _sum(rows, idx); - - case 'AVG': - return len > 0 ? _sum(rows, idx) / len : 0; - - case 'COUNT': - return len; - - default: - } - - return 0; - } - - function _chartLabel(arr, idx, dflt) { - if (arr && arr.length > idx && _.isString(arr[idx])) - return arr[idx]; - - return dflt; - } - - function _chartDatum(paragraph) { - let datum = []; - - if (paragraph.chartColumnsConfigured()) { - paragraph.chartValCols.forEach(function(valCol) { - let index = 0; - let values = []; - const colIdx = valCol.value; - - if (paragraph.chartTimeLineEnabled()) { - const aggFx = valCol.aggFx; - const colLbl = valCol.label + ' [' + aggFx + ']'; - - if (paragraph.charts && paragraph.charts.length === 1) - datum = paragraph.charts[0].data; - - const chartData = _.find(datum, {series: valCol.label}); - - const leftBound = new Date(); - leftBound.setMinutes(leftBound.getMinutes() - parseInt(paragraph.timeLineSpan, 10)); - - if (chartData) { - const lastItem = _.last(paragraph.chartHistory); - - values = chartData.values; - - values.push({ - x: lastItem.tm, - y: _aggregate(lastItem.rows, aggFx, colIdx, index++) - }); - - while (values.length > 0 && values[0].x < leftBound) - values.shift(); - } - else { - _.forEach(paragraph.chartHistory, (history) => { - if (history.tm >= leftBound) { - values.push({ - x: history.tm, - y: _aggregate(history.rows, aggFx, colIdx, index++) - }); - } - }); - - datum.push({series: valCol.label, key: colLbl, values}); - } - } - else { - index = paragraph.total; - - values = _.map(paragraph.rows, function(row) { - const xCol = paragraph.chartKeyCols[0].value; - - const v = { - x: _chartNumber(row, xCol, index), - xLbl: _chartLabel(row, xCol, null), - y: _chartNumber(row, colIdx, index) - }; - - index++; - - return v; - }); - - datum.push({series: valCol.label, key: valCol.label, values}); - } - }); - } - - return datum; - } - - function _xX(d) { - return d.x; - } - - function _yY(d) { - return d.y; - } - - function _xAxisTimeFormat(d) { - return d3.time.format('%X')(new Date(d)); - } - - const _intClasses = ['java.lang.Byte', 'java.lang.Integer', 'java.lang.Long', 'java.lang.Short']; - - function _intType(cls) { - return _.includes(_intClasses, cls); - } - - const _xAxisWithLabelFormat = function(paragraph) { - return function(d) { - const values = paragraph.charts[0].data[0].values; - - const fmt = _intType(paragraph.chartKeyCols[0].type) ? 'd' : ',.2f'; - - const dx = values[d]; - - if (!dx) - return d3.format(fmt)(d); - - const lbl = dx.xLbl; - - return lbl ? lbl : d3.format(fmt)(d); - }; - }; - - function _xAxisLabel(paragraph) { - return _.isEmpty(paragraph.chartKeyCols) ? 'X' : paragraph.chartKeyCols[0].label; - } - - const _yAxisFormat = function(d) { - const fmt = d < 1000 ? ',.2f' : '.3s'; - - return d3.format(fmt)(d); - }; - - function _updateCharts(paragraph) { - $timeout(() => _.forEach(paragraph.charts, (chart) => chart.api.update()), 100); - } - - function _updateChartsWithData(paragraph, newDatum) { - $timeout(() => { - if (!paragraph.chartTimeLineEnabled()) { - const chartDatum = paragraph.charts[0].data; - - chartDatum.length = 0; - - _.forEach(newDatum, (series) => chartDatum.push(series)); - } - - paragraph.charts[0].api.update(); - }); - } - - function _yAxisLabel(paragraph) { - const cols = paragraph.chartValCols; - - const tml = paragraph.chartTimeLineEnabled(); - - return _.isEmpty(cols) ? 'Y' : _.map(cols, function(col) { - let lbl = col.label; - - if (tml) - lbl += ' [' + col.aggFx + ']'; - - return lbl; - }).join(', '); - } - - function _barChart(paragraph) { - const datum = _chartDatum(paragraph); - - if (_.isEmpty(paragraph.charts)) { - const stacked = paragraph.chartsOptions && paragraph.chartsOptions.barChart - ? paragraph.chartsOptions.barChart.stacked - : true; - - const options = { - chart: { - type: 'multiBarChart', - height: 400, - margin: {left: 70}, - duration: 0, - x: _xX, - y: _yY, - xAxis: { - axisLabel: _xAxisLabel(paragraph), - tickFormat: paragraph.chartTimeLineEnabled() ? _xAxisTimeFormat : _xAxisWithLabelFormat(paragraph), - showMaxMin: false - }, - yAxis: { - axisLabel: _yAxisLabel(paragraph), - tickFormat: _yAxisFormat - }, - color: IgniteChartColors, - stacked, - showControls: true, - legend: { - vers: 'furious', - margin: {right: -25} - } - } - }; - - paragraph.charts = [{options, data: datum}]; - - _updateCharts(paragraph); - } - else - _updateChartsWithData(paragraph, datum); - } - - function _pieChartDatum(paragraph) { - const datum = []; - - if (paragraph.chartColumnsConfigured() && !paragraph.chartTimeLineEnabled()) { - paragraph.chartValCols.forEach(function(valCol) { - let index = paragraph.total; - - const values = _.map(paragraph.rows, (row) => { - const xCol = paragraph.chartKeyCols[0].value; - - const v = { - x: xCol < 0 ? index : row[xCol], - y: _chartNumber(row, valCol.value, index) - }; - - // Workaround for known problem with zero values on Pie chart. - if (v.y === 0) - v.y = 0.0001; - - index++; - - return v; - }); - - datum.push({series: paragraph.chartKeyCols[0].label, key: valCol.label, values}); - }); - } - - return datum; - } - - function _pieChart(paragraph) { - let datum = _pieChartDatum(paragraph); - - if (datum.length === 0) - datum = [{values: []}]; - - paragraph.charts = _.map(datum, function(data) { - return { - options: { - chart: { - type: 'pieChart', - height: 400, - duration: 0, - x: _xX, - y: _yY, - showLabels: true, - labelThreshold: 0.05, - labelType: 'percent', - donut: true, - donutRatio: 0.35, - legend: { - vers: 'furious', - margin: { - right: -25 - } - } - }, - title: { - enable: true, - text: data.key - } - }, - data: data.values - }; - }); - - _updateCharts(paragraph); - } - - function _lineChart(paragraph) { - const datum = _chartDatum(paragraph); - - if (_.isEmpty(paragraph.charts)) { - const options = { - chart: { - type: 'lineChart', - height: 400, - margin: { left: 70 }, - duration: 0, - x: _xX, - y: _yY, - xAxis: { - axisLabel: _xAxisLabel(paragraph), - tickFormat: paragraph.chartTimeLineEnabled() ? _xAxisTimeFormat : _xAxisWithLabelFormat(paragraph), - showMaxMin: false - }, - yAxis: { - axisLabel: _yAxisLabel(paragraph), - tickFormat: _yAxisFormat - }, - color: IgniteChartColors, - useInteractiveGuideline: true, - legend: { - vers: 'furious', - margin: { - right: -25 - } - } - } - }; - - paragraph.charts = [{options, data: datum}]; - - _updateCharts(paragraph); - } - else - _updateChartsWithData(paragraph, datum); - } - - function _areaChart(paragraph) { - const datum = _chartDatum(paragraph); - - if (_.isEmpty(paragraph.charts)) { - const style = paragraph.chartsOptions && paragraph.chartsOptions.areaChart - ? paragraph.chartsOptions.areaChart.style - : 'stack'; - - const options = { - chart: { - type: 'stackedAreaChart', - height: 400, - margin: {left: 70}, - duration: 0, - x: _xX, - y: _yY, - xAxis: { - axisLabel: _xAxisLabel(paragraph), - tickFormat: paragraph.chartTimeLineEnabled() ? _xAxisTimeFormat : _xAxisWithLabelFormat(paragraph), - showMaxMin: false - }, - yAxis: { - axisLabel: _yAxisLabel(paragraph), - tickFormat: _yAxisFormat - }, - color: IgniteChartColors, - style, - legend: { - vers: 'furious', - margin: {right: -25} - } - } - }; - - paragraph.charts = [{options, data: datum}]; - - _updateCharts(paragraph); - } - else - _updateChartsWithData(paragraph, datum); - } - - function _chartApplySettings(paragraph, resetCharts) { - if (resetCharts) - paragraph.charts = []; - - if (paragraph.chart() && paragraph.nonEmpty()) { - switch (paragraph.result) { - case 'bar': - _barChart(paragraph); - break; - - case 'pie': - _pieChart(paragraph); - break; - - case 'line': - _lineChart(paragraph); - break; - - case 'area': - _areaChart(paragraph); - break; - - default: - } - } - } - - $scope.chartRemoveKeyColumn = function(paragraph, index) { - paragraph.chartKeyCols.splice(index, 1); - - _chartApplySettings(paragraph, true); - }; - - $scope.chartRemoveValColumn = function(paragraph, index) { - paragraph.chartValCols.splice(index, 1); - - _chartApplySettings(paragraph, true); - }; - - $scope.chartAcceptKeyColumn = function(paragraph, item) { - const accepted = _.findIndex(paragraph.chartKeyCols, item) < 0; - - if (accepted) { - paragraph.chartKeyCols = [item]; - - _chartApplySettings(paragraph, true); - } - - return false; - }; - - const _numberClasses = ['java.math.BigDecimal', 'java.lang.Byte', 'java.lang.Double', - 'java.lang.Float', 'java.lang.Integer', 'java.lang.Long', 'java.lang.Short']; - - const _numberType = function(cls) { - return _.includes(_numberClasses, cls); - }; - - $scope.chartAcceptValColumn = function(paragraph, item) { - const valCols = paragraph.chartValCols; - - const accepted = _.findIndex(valCols, item) < 0 && item.value >= 0 && _numberType(item.type); - - if (accepted) { - if (valCols.length === MAX_VAL_COLS - 1) - valCols.shift(); - - valCols.push(item); - - _chartApplySettings(paragraph, true); - } - - return false; - }; - - $scope.scrollParagraphs = []; - - $scope.rebuildScrollParagraphs = function() { - $scope.scrollParagraphs = $scope.notebook.paragraphs.map(function(paragraph) { - return { - text: paragraph.name, - click: 'scrollToParagraph("' + paragraph.id + '")' - }; - }); - }; - - $scope.scrollToParagraph = function(paragraphId) { - const idx = _.findIndex($scope.notebook.paragraphs, {id: paragraphId}); - - if (idx >= 0) { - if (!_.includes($scope.notebook.expandedParagraphs, idx)) - $scope.notebook.expandedParagraphs.push(idx); - - setTimeout(function() { - $scope.notebook.paragraphs[idx].ace.focus(); - }); - } - - $location.hash(paragraphId); - - $anchorScroll(); - }; - - const _hideColumn = (col) => col.fieldName !== '_KEY' && col.fieldName !== '_VAL'; - - const _allColumn = () => true; - - let paragraphId = 0; - - const _fullColName = function(col) { - const res = []; - - if (col.schemaName) - res.push(col.schemaName); - - if (col.typeName) - res.push(col.typeName); - - res.push(col.fieldName); - - return res.join('.'); - }; - - function enhanceParagraph(paragraph) { - paragraph.nonEmpty = function() { - return this.rows && this.rows.length > 0; - }; - - paragraph.chart = function() { - return this.result !== 'table' && this.result !== 'none'; - }; - - paragraph.queryExecuted = () => - paragraph.queryArgs && paragraph.queryArgs.query && !paragraph.queryArgs.query.startsWith('EXPLAIN '); - - paragraph.table = function() { - return this.result === 'table'; - }; - - paragraph.chartColumnsConfigured = function() { - return !_.isEmpty(this.chartKeyCols) && !_.isEmpty(this.chartValCols); - }; - - paragraph.chartTimeLineEnabled = function() { - return !_.isEmpty(this.chartKeyCols) && angular.equals(this.chartKeyCols[0], TIME_LINE); - }; - - paragraph.timeLineSupported = function() { - return this.result !== 'pie'; - }; - - paragraph.refreshExecuting = function() { - return paragraph.rate && paragraph.rate.stopTime; - }; - - Object.defineProperty(paragraph, 'gridOptions', { value: { - enableGridMenu: false, - enableColumnMenus: false, - flatEntityAccess: true, - fastWatch: true, - updateColumns(cols) { - this.columnDefs = _.map(cols, (col) => { - return { - displayName: col.fieldName, - headerTooltip: _fullColName(col), - field: col.field, - minWidth: 50, - cellClass: 'cell-left' - }; - }); - - $timeout(() => this.api.core.notifyDataChange(uiGridConstants.dataChange.COLUMN)); - }, - updateRows(rows) { - const sizeChanged = this.data.length !== rows.length; - - this.data = rows; - - if (sizeChanged) { - const height = Math.min(rows.length, 15) * 30 + 47; - - // Remove header height. - this.api.grid.element.css('height', height + 'px'); - - $timeout(() => this.api.core.handleWindowResize()); - } - }, - onRegisterApi(api) { - $animate.enabled(api.grid.element, false); - - this.api = api; - } - }}); - - Object.defineProperty(paragraph, 'chartHistory', {value: []}); - } - - $scope.aceInit = function(paragraph) { - return function(editor) { - editor.setAutoScrollEditorIntoView(true); - editor.$blockScrolling = Infinity; - - const renderer = editor.renderer; - - renderer.setHighlightGutterLine(false); - renderer.setShowPrintMargin(false); - renderer.setOption('fontFamily', 'monospace'); - renderer.setOption('fontSize', '14px'); - renderer.setOption('minLines', '5'); - renderer.setOption('maxLines', '15'); - - editor.setTheme('ace/theme/chrome'); - - Object.defineProperty(paragraph, 'ace', { value: editor }); - }; - }; - - const _setActiveCache = function() { - if ($scope.caches.length > 0) { - _.forEach($scope.notebook.paragraphs, (paragraph) => { - if (!_.find($scope.caches, {name: paragraph.cacheName})) - paragraph.cacheName = $scope.caches[0].name; - }); - } - }; - - const _updateTopology = () => - agentMonitor.topology() - .then((clusters) => { - agentMonitor.checkModal(); - - const caches = _.flattenDeep(clusters.map((cluster) => cluster.caches)); - - $scope.caches = _.sortBy(_.map(_.uniqBy(_.reject(caches, {mode: 'LOCAL'}), 'name'), (cache) => { - cache.label = $scope.maskCacheName(cache.name); - - return cache; - }), 'label'); - - _setActiveCache(); - }) - .catch((err) => { - if (err.code === 2) - return agentMonitor.showNodeError('Agent is failed to authenticate in grid. Please check agent\'s login and password.'); - - agentMonitor.showNodeError(err); - }); - - const _startTopologyRefresh = () => { - Loading.start('sqlLoading'); - - agentMonitor.awaitAgent() - .then(_updateTopology) - .finally(() => { - if ($root.IgniteDemoMode) - _.forEach($scope.notebook.paragraphs, $scope.execute); - - Loading.finish('sqlLoading'); - - stopTopology = $interval(_updateTopology, 5000, 0, false); - }); - }; - - const loadNotebook = function(notebook) { - $scope.notebook = notebook; - - $scope.notebook_name = notebook.name; - - if (!$scope.notebook.expandedParagraphs) - $scope.notebook.expandedParagraphs = []; - - if (!$scope.notebook.paragraphs) - $scope.notebook.paragraphs = []; - - _.forEach(notebook.paragraphs, (paragraph) => { - paragraph.id = 'paragraph-' + paragraphId++; - - enhanceParagraph(paragraph); - }); - - if (!notebook.paragraphs || notebook.paragraphs.length === 0) - $scope.addParagraph(); - else - $scope.rebuildScrollParagraphs(); - - agentMonitor.startWatch({ - state: 'base.configuration.clusters', - text: 'Back to Configuration', - goal: 'execute sql statements', - onDisconnect: () => { - _stopTopologyRefresh(); - - _startTopologyRefresh(); - } - }) - .then(_startTopologyRefresh); - }; - - QueryNotebooks.read($state.params.noteId) - .then(loadNotebook) - .catch(() => { - $scope.notebookLoadFailed = true; - - Loading.finish('sqlLoading'); - }); - - $scope.renameNotebook = function(name) { - if (!name) - return; - - if ($scope.notebook.name !== name) { - const prevName = $scope.notebook.name; - - $scope.notebook.name = name; - - QueryNotebooks.save($scope.notebook) - .then(function() { - const idx = _.findIndex($root.notebooks, function(item) { - return item._id === $scope.notebook._id; - }); - - if (idx >= 0) { - $root.notebooks[idx].name = name; - - $root.rebuildDropdown(); - } - - $scope.notebook.edit = false; - }) - .catch((err) => { - $scope.notebook.name = prevName; - - Messages.showError(err); - }); - } - else - $scope.notebook.edit = false; - }; - - $scope.removeNotebook = function() { - Confirm.confirm('Are you sure you want to remove: "' + $scope.notebook.name + '"?') - .then(function() { - return QueryNotebooks.remove($scope.notebook); - }) - .then(function(notebook) { - if (notebook) - $state.go('base.sql.notebook', {noteId: notebook._id}); - else - $state.go('base.configuration.clusters'); - }) - .catch(Messages.showError); - }; - - $scope.renameParagraph = function(paragraph, newName) { - if (!newName) - return; - - if (paragraph.name !== newName) { - paragraph.name = newName; - - $scope.rebuildScrollParagraphs(); - - QueryNotebooks.save($scope.notebook) - .then(() => paragraph.edit = false) - .catch(Messages.showError); - } - else - paragraph.edit = false; - }; - - $scope.addParagraph = function() { - const sz = $scope.notebook.paragraphs.length; - - const paragraph = { - id: 'paragraph-' + paragraphId++, - name: 'Query' + (sz === 0 ? '' : sz), - query: '', - pageSize: $scope.pageSizes[0], - timeLineSpan: $scope.timeLineSpans[0], - result: 'none', - rate: { - value: 1, - unit: 60000, - installed: false - } - }; - - enhanceParagraph(paragraph); - - if ($scope.caches && $scope.caches.length > 0) - paragraph.cacheName = $scope.caches[0].name; - - $scope.notebook.paragraphs.push(paragraph); - - $scope.notebook.expandedParagraphs.push(sz); - - $scope.rebuildScrollParagraphs(); - - $location.hash(paragraph.id); - - $anchorScroll(); - - setTimeout(function() { - paragraph.ace.focus(); - }); - }; - - function _saveChartSettings(paragraph) { - if (!_.isEmpty(paragraph.charts)) { - const chart = paragraph.charts[0].api.getScope().chart; - - if (!LegacyUtils.isDefined(paragraph.chartsOptions)) - paragraph.chartsOptions = {barChart: {stacked: true}, areaChart: {style: 'stack'}}; - - switch (paragraph.result) { - case 'bar': - paragraph.chartsOptions.barChart.stacked = chart.stacked(); - - break; - - case 'area': - paragraph.chartsOptions.areaChart.style = chart.style(); - - break; - - default: - } - } - } - - $scope.setResult = function(paragraph, new_result) { - if (paragraph.result === new_result) - return; - - _saveChartSettings(paragraph); - - paragraph.result = new_result; - - if (paragraph.chart()) - _chartApplySettings(paragraph, true); - else - $timeout(() => paragraph.gridOptions.api.core.handleWindowResize()); - }; - - $scope.resultEq = function(paragraph, result) { - return (paragraph.result === result); - }; - - $scope.removeParagraph = function(paragraph) { - Confirm.confirm('Are you sure you want to remove: "' + paragraph.name + '"?') - .then(function() { - $scope.stopRefresh(paragraph); - - const paragraph_idx = _.findIndex($scope.notebook.paragraphs, function(item) { - return paragraph === item; - }); - - const panel_idx = _.findIndex($scope.expandedParagraphs, function(item) { - return paragraph_idx === item; - }); - - if (panel_idx >= 0) - $scope.expandedParagraphs.splice(panel_idx, 1); - - $scope.notebook.paragraphs.splice(paragraph_idx, 1); - - $scope.rebuildScrollParagraphs(); - - QueryNotebooks.save($scope.notebook) - .catch(Messages.showError); - }); - }; - - $scope.paragraphExpanded = function(paragraph) { - const paragraph_idx = _.findIndex($scope.notebook.paragraphs, function(item) { - return paragraph === item; - }); - - const panel_idx = _.findIndex($scope.notebook.expandedParagraphs, function(item) { - return paragraph_idx === item; - }); - - return panel_idx >= 0; - }; - - const _columnFilter = function(paragraph) { - return paragraph.disabledSystemColumns || paragraph.systemColumns ? _allColumn : _hideColumn; - }; - - const _notObjectType = function(cls) { - return LegacyUtils.isJavaBuiltInClass(cls); - }; - - function _retainColumns(allCols, curCols, acceptableType, xAxis, unwantedCols) { - const retainedCols = []; - - const availableCols = xAxis ? allCols : _.filter(allCols, function(col) { - return col.value >= 0; - }); - - if (availableCols.length > 0) { - curCols.forEach(function(curCol) { - const col = _.find(availableCols, {label: curCol.label}); - - if (col && acceptableType(col.type)) { - col.aggFx = curCol.aggFx; - - retainedCols.push(col); - } - }); - - // If nothing was restored, add first acceptable column. - if (_.isEmpty(retainedCols)) { - let col; - - if (unwantedCols) - col = _.find(availableCols, (avCol) => !_.find(unwantedCols, {label: avCol.label}) && acceptableType(avCol.type)); - - if (!col) - col = _.find(availableCols, (avCol) => acceptableType(avCol.type)); - - if (col) - retainedCols.push(col); - } - } - - return retainedCols; - } - - const _rebuildColumns = function(paragraph) { - _.forEach(_.groupBy(paragraph.meta, 'fieldName'), function(colsByName, fieldName) { - const colsByTypes = _.groupBy(colsByName, 'typeName'); - - const needType = _.keys(colsByTypes).length > 1; - - _.forEach(colsByTypes, function(colsByType, typeName) { - _.forEach(colsByType, function(col, ix) { - col.fieldName = (needType && !LegacyUtils.isEmptyString(typeName) ? typeName + '.' : '') + fieldName + (ix > 0 ? ix : ''); - }); - }); - }); - - const cols = []; - - _.forEach(paragraph.meta, (col, idx) => { - if (paragraph.columnFilter(col)) { - col.field = paragraph.queryArgs.query ? idx.toString() : col.fieldName; - - cols.push(col); - } - }); - - paragraph.gridOptions.updateColumns(cols); - - paragraph.chartColumns = _.reduce(cols, (acc, col) => { - if (_notObjectType(col.fieldTypeName)) { - acc.push({ - label: col.fieldName, - type: col.fieldTypeName, - aggFx: $scope.aggregateFxs[0], - value: col.field - }); - } - - return acc; - }, []); - - if (paragraph.chartColumns.length > 0) { - paragraph.chartColumns.push(TIME_LINE); - paragraph.chartColumns.push(ROW_IDX); - } - - // We could accept onl not object columns for X axis. - paragraph.chartKeyCols = _retainColumns(paragraph.chartColumns, paragraph.chartKeyCols, _notObjectType, true); - - // We could accept only numeric columns for Y axis. - paragraph.chartValCols = _retainColumns(paragraph.chartColumns, paragraph.chartValCols, _numberType, false, paragraph.chartKeyCols); - }; - - $scope.toggleSystemColumns = function(paragraph) { - if (paragraph.disabledSystemColumns) - return; - - paragraph.systemColumns = !paragraph.systemColumns; - - paragraph.columnFilter = _columnFilter(paragraph); - - paragraph.chartColumns = []; - - _rebuildColumns(paragraph); - }; - - const _showLoading = (paragraph, enable) => paragraph.loading = enable; - - /** - * @param {Object} paragraph Query - * @param {{fieldsMetadata: Array, items: Array, queryId: int, last: Boolean}} res Query results. - * @private - */ - const _processQueryResult = function(paragraph, res) { - const prevKeyCols = paragraph.chartKeyCols; - const prevValCols = paragraph.chartValCols; - - if (!_.eq(paragraph.meta, res.fieldsMetadata)) { - paragraph.meta = []; - - paragraph.chartColumns = []; - - if (!LegacyUtils.isDefined(paragraph.chartKeyCols)) - paragraph.chartKeyCols = []; - - if (!LegacyUtils.isDefined(paragraph.chartValCols)) - paragraph.chartValCols = []; - - if (res.fieldsMetadata.length <= 2) { - const _key = _.find(res.fieldsMetadata, {fieldName: '_KEY'}); - const _val = _.find(res.fieldsMetadata, {fieldName: '_VAL'}); - - paragraph.disabledSystemColumns = (res.fieldsMetadata.length === 2 && _key && _val) || - (res.fieldsMetadata.length === 1 && (_key || _val)); - } - - paragraph.columnFilter = _columnFilter(paragraph); - - paragraph.meta = res.fieldsMetadata; - - _rebuildColumns(paragraph); - } - - paragraph.page = 1; - - paragraph.total = 0; - - paragraph.queryId = res.last ? null : res.queryId; - - delete paragraph.errMsg; - - // Prepare explain results for display in table. - if (paragraph.queryArgs.query && paragraph.queryArgs.query.startsWith('EXPLAIN') && res.items) { - paragraph.rows = []; - - res.items.forEach(function(row, i) { - const line = res.items.length - 1 === i ? row[0] : row[0] + '\n'; - - line.replace(/\"/g, '').split('\n').forEach((ln) => paragraph.rows.push([ln])); - }); - } - else - paragraph.rows = res.items; - - paragraph.gridOptions.updateRows(paragraph.rows); - - const chartHistory = paragraph.chartHistory; - - // Clear history on query change. - const queryChanged = paragraph.prevQuery !== paragraph.query; - - if (queryChanged) { - paragraph.prevQuery = paragraph.query; - - chartHistory.length = 0; - - _.forEach(paragraph.charts, (chart) => chart.data.length = 0); - } - - // Add results to history. - chartHistory.push({tm: new Date(), rows: paragraph.rows}); - - // Keep history size no more than max length. - while (chartHistory.length > HISTORY_LENGTH) - chartHistory.shift(); - - _showLoading(paragraph, false); - - if (paragraph.result === 'none' || !paragraph.queryExecuted()) - paragraph.result = 'table'; - else if (paragraph.chart()) { - let resetCharts = queryChanged; - - if (!resetCharts) { - const curKeyCols = paragraph.chartKeyCols; - const curValCols = paragraph.chartValCols; - - resetCharts = !prevKeyCols || !prevValCols || - prevKeyCols.length !== curKeyCols.length || - prevValCols.length !== curValCols.length; - } - - _chartApplySettings(paragraph, resetCharts); - } - }; - - const _closeOldQuery = (paragraph) => { - const queryId = paragraph.queryArgs && paragraph.queryArgs.queryId; - - return queryId ? agentMonitor.queryClose(queryId) : $q.when(); - }; - - const _executeRefresh = (paragraph) => { - const args = paragraph.queryArgs; - - agentMonitor.awaitAgent() - .then(() => _closeOldQuery(paragraph)) - .then(() => agentMonitor.query(args.cacheName, args.pageSize, args.query)) - .then(_processQueryResult.bind(this, paragraph)) - .catch((err) => paragraph.errMsg = err.message); - }; - - const _tryStartRefresh = function(paragraph) { - _tryStopRefresh(paragraph); - - if (paragraph.rate && paragraph.rate.installed && paragraph.queryArgs) { - $scope.chartAcceptKeyColumn(paragraph, TIME_LINE); - - _executeRefresh(paragraph); - - const delay = paragraph.rate.value * paragraph.rate.unit; - - paragraph.rate.stopTime = $interval(_executeRefresh, delay, 0, false, paragraph); - } - }; - - $scope.execute = function(paragraph) { - QueryNotebooks.save($scope.notebook) - .catch(Messages.showError); - - paragraph.prevQuery = paragraph.queryArgs ? paragraph.queryArgs.query : paragraph.query; - - _showLoading(paragraph, true); - - _closeOldQuery(paragraph) - .then(function() { - const args = paragraph.queryArgs = { - cacheName: paragraph.cacheName, - pageSize: paragraph.pageSize, - query: paragraph.query - }; - - return agentMonitor.query(args.cacheName, args.pageSize, args.query); - }) - .then(function(res) { - _processQueryResult(paragraph, res); - - _tryStartRefresh(paragraph); - }) - .catch((err) => { - paragraph.errMsg = err.message; - - _showLoading(paragraph, false); - - $scope.stopRefresh(paragraph); - }) - .finally(() => paragraph.ace.focus()); - }; - - $scope.queryExecuted = function(paragraph) { - return LegacyUtils.isDefined(paragraph.queryArgs); - }; - - const _cancelRefresh = function(paragraph) { - if (paragraph.rate && paragraph.rate.stopTime) { - delete paragraph.queryArgs; - - paragraph.rate.installed = false; - - $interval.cancel(paragraph.rate.stopTime); - - delete paragraph.rate.stopTime; - } - }; - - $scope.explain = function(paragraph) { - QueryNotebooks.save($scope.notebook) - .catch(Messages.showError); - - _cancelRefresh(paragraph); - - _showLoading(paragraph, true); - - _closeOldQuery(paragraph) - .then(function() { - const args = paragraph.queryArgs = { - cacheName: paragraph.cacheName, - pageSize: paragraph.pageSize, - query: 'EXPLAIN ' + paragraph.query - }; - - return agentMonitor.query(args.cacheName, args.pageSize, args.query); - }) - .then(_processQueryResult.bind(this, paragraph)) - .catch((err) => { - paragraph.errMsg = err.message; - - _showLoading(paragraph, false); - }) - .finally(() => paragraph.ace.focus()); - }; - - $scope.scan = function(paragraph) { - QueryNotebooks.save($scope.notebook) - .catch(Messages.showError); - - _cancelRefresh(paragraph); - - _showLoading(paragraph, true); - - _closeOldQuery(paragraph) - .then(() => { - const args = paragraph.queryArgs = { - cacheName: paragraph.cacheName, - pageSize: paragraph.pageSize - }; - - return agentMonitor.query(args.cacheName, args.pageSize); - }) - .then(_processQueryResult.bind(this, paragraph)) - .catch((err) => { - paragraph.errMsg = err.message; - - _showLoading(paragraph, false); - }) - .finally(() => paragraph.ace.focus()); - }; - - function _updatePieChartsWithData(paragraph, newDatum) { - $timeout(() => { - _.forEach(paragraph.charts, function(chart) { - const chartDatum = chart.data; - - chartDatum.length = 0; - - _.forEach(newDatum, function(series) { - if (chart.options.title.text === series.key) - _.forEach(series.values, (v) => chartDatum.push(v)); - }); - }); - - _.forEach(paragraph.charts, (chart) => chart.api.update()); - }); - } - - $scope.nextPage = function(paragraph) { - _showLoading(paragraph, true); - - paragraph.queryArgs.pageSize = paragraph.pageSize; - - agentMonitor.next(paragraph.queryId, paragraph.pageSize) - .then(function(res) { - paragraph.page++; - - paragraph.total += paragraph.rows.length; - - paragraph.rows = res.items; - - if (paragraph.chart()) { - if (paragraph.result === 'pie') - _updatePieChartsWithData(paragraph, _pieChartDatum(paragraph)); - else - _updateChartsWithData(paragraph, _chartDatum(paragraph)); - } - - paragraph.gridOptions.updateRows(paragraph.rows); - - _showLoading(paragraph, false); - - if (res.last) - delete paragraph.queryId; - }) - .catch((err) => { - paragraph.errMsg = err.message; - - _showLoading(paragraph, false); - }) - .finally(() => paragraph.ace.focus()); - }; - - const _export = (fileName, columnFilter, meta, rows) => { - let csvContent = ''; - - const cols = []; - const excludedCols = []; - - if (meta) { - _.forEach(meta, (col, idx) => { - if (columnFilter(col)) - cols.push(_fullColName(col)); - else - excludedCols.push(idx); - }); - - csvContent += cols.join(';') + '\n'; - } - - _.forEach(rows, (row) => { - cols.length = 0; - - if (Array.isArray(row)) { - _.forEach(row, (elem, idx) => { - if (_.includes(excludedCols, idx)) - return; - - cols.push(_.isUndefined(elem) ? '' : JSON.stringify(elem)); - }); - } - else { - _.forEach(meta, (col) => { - if (columnFilter(col)) { - const elem = row[col.fieldName]; - - cols.push(_.isUndefined(elem) ? '' : JSON.stringify(elem)); - } - }); - } - - csvContent += cols.join(';') + '\n'; - }); - - LegacyUtils.download('application/octet-stream;charset=utf-8', fileName, escape(csvContent)); - }; - - $scope.exportCsv = function(paragraph) { - _export(paragraph.name + '.csv', paragraph.columnFilter, paragraph.meta, paragraph.rows); - - // paragraph.gridOptions.api.exporter.csvExport(uiGridExporterConstants.ALL, uiGridExporterConstants.VISIBLE); - }; - - $scope.exportPdf = function(paragraph) { - paragraph.gridOptions.api.exporter.pdfExport(uiGridExporterConstants.ALL, uiGridExporterConstants.VISIBLE); - }; - - $scope.exportCsvAll = function(paragraph) { - const args = paragraph.queryArgs; - - agentMonitor.queryGetAll(args.cacheName, args.query) - .then((res) => _export(paragraph.name + '-all.csv', paragraph.columnFilter, res.fieldsMetadata, res.items)) - .catch(Messages.showError) - .finally(() => paragraph.ace.focus()); - }; - - // $scope.exportPdfAll = function(paragraph) { - // $http.post('/api/v1/agent/query/getAll', {query: paragraph.query, cacheName: paragraph.cacheName}) - // .success(function(item) { - // _export(paragraph.name + '-all.csv', item.meta, item.rows); - // }) - // .error(Messages.showError); - // }; - - $scope.rateAsString = function(paragraph) { - if (paragraph.rate && paragraph.rate.installed) { - const idx = _.findIndex($scope.timeUnit, function(unit) { - return unit.value === paragraph.rate.unit; - }); - - if (idx >= 0) - return ' ' + paragraph.rate.value + $scope.timeUnit[idx].short; - - paragraph.rate.installed = false; - } - - return ''; - }; - - $scope.startRefresh = function(paragraph, value, unit) { - paragraph.rate.value = value; - paragraph.rate.unit = unit; - paragraph.rate.installed = true; - - if (paragraph.queryExecuted()) - _tryStartRefresh(paragraph); - }; - - $scope.stopRefresh = function(paragraph) { - paragraph.rate.installed = false; - - _tryStopRefresh(paragraph); - }; - - $scope.paragraphTimeSpanVisible = function(paragraph) { - return paragraph.timeLineSupported() && paragraph.chartTimeLineEnabled(); - }; - - $scope.paragraphTimeLineSpan = function(paragraph) { - if (paragraph && paragraph.timeLineSpan) - return paragraph.timeLineSpan.toString(); - - return '1'; - }; - - $scope.applyChartSettings = function(paragraph) { - _chartApplySettings(paragraph, true); - }; - - $scope.actionAvailable = function(paragraph, needQuery) { - return $scope.caches.length > 0 && (!needQuery || paragraph.query) && !paragraph.loading; - }; - - $scope.actionTooltip = function(paragraph, action, needQuery) { - if ($scope.actionAvailable(paragraph, needQuery)) - return; - - if (paragraph.loading) - return 'Waiting for server response'; - - return 'To ' + action + ' query select cache' + (needQuery ? ' and input query' : ''); - }; - - $scope.clickableMetadata = function(node) { - return node.type.slice(0, 5) !== 'index'; - }; - - $scope.dblclickMetadata = function(paragraph, node) { - paragraph.ace.insert(node.name); - - setTimeout(function() { - paragraph.ace.focus(); - }, 1); - }; - - $scope.importMetadata = function() { - Loading.start('loadingCacheMetadata'); - - $scope.metadata = []; - - agentMonitor.metadata() - .then((metadata) => { - $scope.metadata = _.sortBy(_.filter(metadata, (meta) => { - const cache = _.find($scope.caches, { name: meta.cacheName }); - - if (cache) { - meta.name = (cache.sqlSchema || '"' + meta.cacheName + '"') + '.' + meta.typeName; - meta.displayName = (cache.sqlSchema || meta.maskedName) + '.' + meta.typeName; - - if (cache.sqlSchema) - meta.children.unshift({type: 'plain', name: 'cacheName: ' + meta.maskedName, maskedName: meta.maskedName}); - - meta.children.unshift({type: 'plain', name: 'mode: ' + cache.mode, maskedName: meta.maskedName}); - } - - return cache; - }), 'name'); - }) - .catch(Messages.showError) - .finally(() => Loading.finish('loadingCacheMetadata')); - }; - - $scope.showResultQuery = function(paragraph) { - if (LegacyUtils.isDefined(paragraph)) { - const scope = $scope.$new(); - - if (_.isNil(paragraph.queryArgs.query)) { - scope.title = 'SCAN query'; - scope.content = [`SCAN query for cache: <b>${$scope.maskCacheName(paragraph.queryArgs.cacheName)}</b>`]; - } - else if (paragraph.queryArgs.query .startsWith('EXPLAIN ')) { - scope.title = 'Explain query'; - scope.content = [paragraph.queryArgs.query]; - } - else { - scope.title = 'SQL query'; - scope.content = [paragraph.queryArgs.query]; - } - - // Show a basic modal from a controller - $modal({scope, template: '/templates/message.html', placement: 'center', show: true}); - } - }; - } -]];
http://git-wip-us.apache.org/repos/asf/ignite/blob/6af6560a/modules/web-console/src/main/js/generator/generator-common.js ---------------------------------------------------------------------- diff --git a/modules/web-console/src/main/js/generator/generator-common.js b/modules/web-console/src/main/js/generator/generator-common.js deleted file mode 100644 index 10bd299..0000000 --- a/modules/web-console/src/main/js/generator/generator-common.js +++ /dev/null @@ -1,611 +0,0 @@ -/* - * 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. - */ - -// Entry point for common functions for code generation. -const $generatorCommon = {}; - -// Add leading zero. -$generatorCommon.addLeadingZero = function(numberStr, minSize) { - if (typeof (numberStr) !== 'string') - numberStr = String(numberStr); - - while (numberStr.length < minSize) - numberStr = '0' + numberStr; - - return numberStr; -}; - -// Format date to string. -$generatorCommon.formatDate = function(date) { - const dd = $generatorCommon.addLeadingZero(date.getDate(), 2); - const mm = $generatorCommon.addLeadingZero(date.getMonth() + 1, 2); - - const yyyy = date.getFullYear(); - - return mm + '/' + dd + '/' + yyyy + ' ' + $generatorCommon.addLeadingZero(date.getHours(), 2) + ':' + $generatorCommon.addLeadingZero(date.getMinutes(), 2); -}; - -// Generate comment for generated XML, Java, ... files. -$generatorCommon.mainComment = function mainComment() { - return 'This configuration was generated by Ignite Web Console (' + $generatorCommon.formatDate(new Date()) + ')'; -}; - -// Create result holder with service functions and properties for XML and java code generation. -$generatorCommon.builder = function(deep) { - if (_.isNil($generatorCommon.JavaTypes)) - $generatorCommon.JavaTypes = angular.element(document.getElementById('app')).injector().get('JavaTypes'); - - const res = []; - - res.deep = deep || 0; - res.needEmptyLine = false; - res.lineStart = true; - res.datasources = []; - res.imports = {}; - res.staticImports = {}; - res.vars = {}; - - res.safeDeep = 0; - res.safeNeedEmptyLine = false; - res.safeImports = {}; - res.safeDatasources = []; - res.safePoint = -1; - - res.mergeProps = function(fromRes) { - if ($generatorCommon.isDefinedAndNotEmpty(fromRes)) { - res.datasources = fromRes.datasources; - - angular.extend(res.imports, fromRes.imports); - angular.extend(res.staticImports, fromRes.staticImports); - angular.extend(res.vars, fromRes.vars); - } - }; - - res.mergeLines = function(fromRes) { - if ($generatorCommon.isDefinedAndNotEmpty(fromRes)) { - if (res.needEmptyLine) - res.push(''); - - _.forEach(fromRes, function(line) { - res.append(line); - }); - } - }; - - res.startSafeBlock = function() { - res.safeDeep = this.deep; - this.safeNeedEmptyLine = this.needEmptyLine; - this.safeImports = _.cloneDeep(this.imports); - this.safeStaticImports = _.cloneDeep(this.staticImports); - this.safeDatasources = this.datasources.slice(); - this.safePoint = this.length; - }; - - res.rollbackSafeBlock = function() { - if (this.safePoint >= 0) { - this.splice(this.safePoint, this.length - this.safePoint); - - this.deep = res.safeDeep; - this.needEmptyLine = this.safeNeedEmptyLine; - this.datasources = this.safeDatasources; - this.imports = this.safeImports; - this.staticImports = this.safeStaticImports; - this.safePoint = -1; - } - }; - - res.asString = function() { - return this.join('\n'); - }; - - res.append = function(s) { - this.push((this.lineStart ? _.repeat(' ', this.deep) : '') + s); - - return this; - }; - - res.line = function(s) { - if (s) { - if (res.needEmptyLine) - res.push(''); - - res.append(s); - } - - res.needEmptyLine = false; - - res.lineStart = true; - - return res; - }; - - res.startBlock = function(s) { - if (s) { - if (this.needEmptyLine) - this.push(''); - - this.append(s); - } - - this.needEmptyLine = false; - - this.lineStart = true; - - this.deep++; - - return this; - }; - - res.endBlock = function(s) { - this.deep--; - - if (s) - this.append(s); - - this.lineStart = true; - - return this; - }; - - res.softEmptyLine = function() { - this.needEmptyLine = this.length > 0; - }; - - res.emptyLineIfNeeded = function() { - if (this.needEmptyLine) { - this.push(''); - this.lineStart = true; - - this.needEmptyLine = false; - } - }; - - /** - * Add class to imports. - * - * @param clsName Full class name. - * @returns {String} Short class name or full class name in case of names conflict. - */ - res.importClass = function(clsName) { - if ($generatorCommon.JavaTypes.isJavaPrimitive(clsName)) - return clsName; - - const fullClassName = $generatorCommon.JavaTypes.fullClassName(clsName); - - const dotIdx = fullClassName.lastIndexOf('.'); - - const shortName = dotIdx > 0 ? fullClassName.substr(dotIdx + 1) : fullClassName; - - if (this.imports[shortName]) { - if (this.imports[shortName] !== fullClassName) - return fullClassName; // Short class names conflict. Return full name. - } - else - this.imports[shortName] = fullClassName; - - return shortName; - }; - - /** - * Add class to imports. - * - * @param member Static member. - * @returns {String} Short class name or full class name in case of names conflict. - */ - res.importStatic = function(member) { - const dotIdx = member.lastIndexOf('.'); - - const shortName = dotIdx > 0 ? member.substr(dotIdx + 1) : member; - - if (this.staticImports[shortName]) { - if (this.staticImports[shortName] !== member) - return member; // Short class names conflict. Return full name. - } - else - this.staticImports[shortName] = member; - - return shortName; - }; - - /** - * @returns String with "java imports" section. - */ - res.generateImports = function() { - const genImports = []; - - for (const clsName in this.imports) { - if (this.imports.hasOwnProperty(clsName) && this.imports[clsName].lastIndexOf('java.lang.', 0) !== 0) - genImports.push('import ' + this.imports[clsName] + ';'); - } - - genImports.sort(); - - return genImports.join('\n'); - }; - - /** - * @returns String with "java imports" section. - */ - res.generateStaticImports = function() { - const statImports = []; - - for (const clsName in this.staticImports) { - if (this.staticImports.hasOwnProperty(clsName) && this.staticImports[clsName].lastIndexOf('java.lang.', 0) !== 0) - statImports.push('import static ' + this.staticImports[clsName] + ';'); - } - - statImports.sort(); - - return statImports.join('\n'); - }; - - return res; -}; - -// Eviction policies code generation descriptors. -$generatorCommon.EVICTION_POLICIES = { - LRU: { - className: 'org.apache.ignite.cache.eviction.lru.LruEvictionPolicy', - fields: {batchSize: {dflt: 1}, maxMemorySize: null, maxSize: {dflt: 100000}} - }, - FIFO: { - className: 'org.apache.ignite.cache.eviction.fifo.FifoEvictionPolicy', - fields: {batchSize: {dflt: 1}, maxMemorySize: null, maxSize: {dflt: 100000}} - }, - SORTED: { - className: 'org.apache.ignite.cache.eviction.sorted.SortedEvictionPolicy', - fields: {batchSize: {dflt: 1}, maxMemorySize: null, maxSize: {dflt: 100000}} - } -}; - -// Marshaller code generation descriptors. -$generatorCommon.MARSHALLERS = { - OptimizedMarshaller: { - className: 'org.apache.ignite.marshaller.optimized.OptimizedMarshaller', - fields: {poolSize: null, requireSerializable: null } - }, - JdkMarshaller: { - className: 'org.apache.ignite.marshaller.jdk.JdkMarshaller', - fields: {} - } -}; - -// Pairs of supported databases and their JDBC dialects. -$generatorCommon.JDBC_DIALECTS = { - Generic: 'org.apache.ignite.cache.store.jdbc.dialect.BasicJdbcDialect', - Oracle: 'org.apache.ignite.cache.store.jdbc.dialect.OracleDialect', - DB2: 'org.apache.ignite.cache.store.jdbc.dialect.DB2Dialect', - SQLServer: 'org.apache.ignite.cache.store.jdbc.dialect.SQLServerDialect', - MySQL: 'org.apache.ignite.cache.store.jdbc.dialect.MySQLDialect', - PostgreSQL: 'org.apache.ignite.cache.store.jdbc.dialect.BasicJdbcDialect', - H2: 'org.apache.ignite.cache.store.jdbc.dialect.H2Dialect' -}; - -// Return JDBC dialect full class name for specified database. -$generatorCommon.jdbcDialectClassName = function(db) { - const dialectClsName = $generatorCommon.JDBC_DIALECTS[db]; - - return dialectClsName ? dialectClsName : 'Unknown database: ' + db; -}; - -// Generate default data cache for specified igfs instance. -$generatorCommon.igfsDataCache = function(igfs) { - return { - name: igfs.name + '-data', - cacheMode: 'PARTITIONED', - atomicityMode: 'TRANSACTIONAL', - writeSynchronizationMode: 'FULL_SYNC', - backups: 0, - igfsAffinnityGroupSize: igfs.affinnityGroupSize || 512 - }; -}; - -// Generate default meta cache for specified igfs instance. -$generatorCommon.igfsMetaCache = function(igfs) { - return { - name: igfs.name + '-meta', - cacheMode: 'REPLICATED', - atomicityMode: 'TRANSACTIONAL', - writeSynchronizationMode: 'FULL_SYNC' - }; -}; - -// Pairs of supported databases and their data sources. -$generatorCommon.DATA_SOURCES = { - Generic: 'com.mchange.v2.c3p0.ComboPooledDataSource', - Oracle: 'oracle.jdbc.pool.OracleDataSource', - DB2: 'com.ibm.db2.jcc.DB2DataSource', - SQLServer: 'com.microsoft.sqlserver.jdbc.SQLServerDataSource', - MySQL: 'com.mysql.jdbc.jdbc2.optional.MysqlDataSource', - PostgreSQL: 'org.postgresql.ds.PGPoolingDataSource', - H2: 'org.h2.jdbcx.JdbcDataSource' -}; - -// Return data source full class name for specified database. -$generatorCommon.dataSourceClassName = function(db) { - const dsClsName = $generatorCommon.DATA_SOURCES[db]; - - return dsClsName ? dsClsName : 'Unknown database: ' + db; -}; - -// Store factories code generation descriptors. -$generatorCommon.STORE_FACTORIES = { - CacheJdbcPojoStoreFactory: { - className: 'org.apache.ignite.cache.store.jdbc.CacheJdbcPojoStoreFactory', - suffix: 'JdbcPojo', - fields: { - configuration: {type: 'bean'} - } - }, - CacheJdbcBlobStoreFactory: { - className: 'org.apache.ignite.cache.store.jdbc.CacheJdbcBlobStoreFactory', - suffix: 'JdbcBlob', - fields: { - initSchema: null, - createTableQuery: null, - loadQuery: null, - insertQuery: null, - updateQuery: null, - deleteQuery: null - } - }, - CacheHibernateBlobStoreFactory: { - className: 'org.apache.ignite.cache.store.hibernate.CacheHibernateBlobStoreFactory', - suffix: 'Hibernate', - fields: {hibernateProperties: {type: 'propertiesAsList', propVarName: 'props'}} - } -}; - -// Swap space SPI code generation descriptor. -$generatorCommon.SWAP_SPACE_SPI = { - className: 'org.apache.ignite.spi.swapspace.file.FileSwapSpaceSpi', - fields: { - baseDirectory: {type: 'path'}, - readStripesNumber: null, - maximumSparsity: {type: 'float'}, - maxWriteQueueSize: null, - writeBufferSize: null - } -}; - -// Transaction configuration code generation descriptor. -$generatorCommon.TRANSACTION_CONFIGURATION = { - className: 'org.apache.ignite.configuration.TransactionConfiguration', - fields: { - defaultTxConcurrency: {type: 'enum', enumClass: 'org.apache.ignite.transactions.TransactionConcurrency', dflt: 'PESSIMISTIC'}, - defaultTxIsolation: {type: 'enum', enumClass: 'org.apache.ignite.transactions.TransactionIsolation', dflt: 'REPEATABLE_READ'}, - defaultTxTimeout: {dflt: 0}, - pessimisticTxLogLinger: {dflt: 10000}, - pessimisticTxLogSize: null, - txSerializableEnabled: null, - txManagerFactory: {type: 'bean'} - } -}; - -// SSL configuration code generation descriptor. -$generatorCommon.SSL_CONFIGURATION_TRUST_FILE_FACTORY = { - className: 'org.apache.ignite.ssl.SslContextFactory', - fields: { - keyAlgorithm: null, - keyStoreFilePath: {type: 'path'}, - keyStorePassword: {type: 'raw'}, - keyStoreType: null, - protocol: null, - trustStoreFilePath: {type: 'path'}, - trustStorePassword: {type: 'raw'}, - trustStoreType: null - } -}; - -// SSL configuration code generation descriptor. -$generatorCommon.SSL_CONFIGURATION_TRUST_MANAGER_FACTORY = { - className: 'org.apache.ignite.ssl.SslContextFactory', - fields: { - keyAlgorithm: null, - keyStoreFilePath: {type: 'path'}, - keyStorePassword: {type: 'raw'}, - keyStoreType: null, - protocol: null, - trustManagers: {type: 'array'} - } -}; - -// Communication configuration code generation descriptor. -$generatorCommon.CONNECTOR_CONFIGURATION = { - className: 'org.apache.ignite.configuration.ConnectorConfiguration', - fields: { - jettyPath: null, - host: null, - port: {dflt: 11211}, - portRange: {dflt: 100}, - idleTimeout: {dflt: 7000}, - idleQueryCursorTimeout: {dflt: 600000}, - idleQueryCursorCheckFrequency: {dflt: 60000}, - receiveBufferSize: {dflt: 32768}, - sendBufferSize: {dflt: 32768}, - sendQueueLimit: {dflt: 0}, - directBuffer: {dflt: false}, - noDelay: {dflt: true}, - selectorCount: null, - threadPoolSize: null, - messageInterceptor: {type: 'bean'}, - secretKey: null, - sslEnabled: {dflt: false} - } -}; - -// Communication configuration code generation descriptor. -$generatorCommon.COMMUNICATION_CONFIGURATION = { - className: 'org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi', - fields: { - listener: {type: 'bean'}, - localAddress: null, - localPort: {dflt: 47100}, - localPortRange: {dflt: 100}, - sharedMemoryPort: {dflt: 48100}, - directBuffer: {dflt: false}, - directSendBuffer: {dflt: false}, - idleConnectionTimeout: {dflt: 30000}, - connectTimeout: {dflt: 5000}, - maxConnectTimeout: {dflt: 600000}, - reconnectCount: {dflt: 10}, - socketSendBuffer: {dflt: 32768}, - socketReceiveBuffer: {dflt: 32768}, - messageQueueLimit: {dflt: 1024}, - slowClientQueueLimit: null, - tcpNoDelay: {dflt: true}, - ackSendThreshold: {dflt: 16}, - unacknowledgedMessagesBufferSize: {dflt: 0}, - socketWriteTimeout: {dflt: 2000}, - selectorsCount: null, - addressResolver: {type: 'bean'} - } -}; - -// Communication configuration code generation descriptor. -$generatorCommon.IGFS_IPC_CONFIGURATION = { - className: 'org.apache.ignite.igfs.IgfsIpcEndpointConfiguration', - fields: { - type: {type: 'enum', enumClass: 'org.apache.ignite.igfs.IgfsIpcEndpointType'}, - host: {dflt: '127.0.0.1'}, - port: {dflt: 10500}, - memorySize: {dflt: 262144}, - tokenDirectoryPath: {dflt: 'ipc/shmem'} - } -}; - -// Check that cache has datasource. -$generatorCommon.cacheHasDatasource = function(cache) { - if (cache.cacheStoreFactory && cache.cacheStoreFactory.kind) { - const storeFactory = cache.cacheStoreFactory[cache.cacheStoreFactory.kind]; - - return !!(storeFactory && (storeFactory.connectVia ? (storeFactory.connectVia === 'DataSource' ? storeFactory.dialect : false) : storeFactory.dialect)); // eslint-disable-line no-nested-ternary - } - - return false; -}; - -$generatorCommon.secretPropertiesNeeded = function(cluster) { - return !_.isNil(_.find(cluster.caches, $generatorCommon.cacheHasDatasource)) || cluster.sslEnabled; -}; - -// Check that binary is configured. -$generatorCommon.binaryIsDefined = function(binary) { - return binary && ($generatorCommon.isDefinedAndNotEmpty(binary.idMapper) || $generatorCommon.isDefinedAndNotEmpty(binary.nameMapper) || - $generatorCommon.isDefinedAndNotEmpty(binary.serializer) || $generatorCommon.isDefinedAndNotEmpty(binary.typeConfigurations) || - (!_.isNil(binary.compactFooter) && !binary.compactFooter)); -}; - -// Extract domain model metadata location. -$generatorCommon.domainQueryMetadata = function(domain) { - return domain.queryMetadata ? domain.queryMetadata : 'Configuration'; -}; - -/** - * @param {Object} obj Object to check. - * @param {Array<String>} props Array of properties names. - * @returns {boolean} 'true' if - */ -$generatorCommon.hasAtLeastOneProperty = function(obj, props) { - return obj && props && _.findIndex(props, (prop) => !_.isNil(obj[prop])) >= 0; -}; - -/** - * Convert some name to valid java name. - * - * @param prefix To append to java name. - * @param name to convert. - * @returns {string} Valid java name. - */ -$generatorCommon.toJavaName = function(prefix, name) { - const javaName = name ? name.replace(/[^A-Za-z_0-9]+/g, '_') : 'dflt'; - - return prefix + javaName.charAt(0).toLocaleUpperCase() + javaName.slice(1); -}; - -/** - * @param v Value to check. - * @returns {boolean} 'true' if value defined and not empty string. - */ -$generatorCommon.isDefinedAndNotEmpty = function(v) { - let defined = !_.isNil(v); - - if (defined && (_.isString(v) || _.isArray(v))) - defined = v.length > 0; - - return defined; -}; - -/** - * @param {Object} obj Object to check. - * @param {Array<String>} props Properties names. - * @returns {boolean} 'true' if object contains at least one from specified properties. - */ -$generatorCommon.hasProperty = function(obj, props) { - for (const propName in props) { - if (props.hasOwnProperty(propName)) { - if (obj[propName]) - return true; - } - } - - return false; -}; - -/** - * Get class for selected implementation of Failover SPI. - * - * @param spi Failover SPI configuration. - * @returns {*} Class for selected implementation of Failover SPI. - */ -$generatorCommon.failoverSpiClass = function(spi) { - switch (spi.kind) { - case 'JobStealing': return 'org.apache.ignite.spi.failover.jobstealing.JobStealingFailoverSpi'; - case 'Never': return 'org.apache.ignite.spi.failover.never.NeverFailoverSpi'; - case 'Always': return 'org.apache.ignite.spi.failover.always.AlwaysFailoverSpi'; - case 'Custom': return _.get(spi, 'Custom.class'); - default: return 'Unknown'; - } -}; - -$generatorCommon.loggerConfigured = function(logger) { - if (logger && logger.kind) { - const log = logger[logger.kind]; - - switch (logger.kind) { - case 'Log4j2': return log && $generatorCommon.isDefinedAndNotEmpty(log.path); - - case 'Log4j': - if (!log || !log.mode) - return false; - - if (log.mode === 'Path') - return $generatorCommon.isDefinedAndNotEmpty(log.path); - - return true; - - case 'Custom': return log && $generatorCommon.isDefinedAndNotEmpty(log.class); - - default: - return true; - } - } - - return false; -}; - -export default $generatorCommon;
