Repository: ignite Updated Branches: refs/heads/ignite-843 e47c26b7b -> f155bceaf
IGNITE-843 Implemented schemas selection. Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/f155bcea Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/f155bcea Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/f155bcea Branch: refs/heads/ignite-843 Commit: f155bceaf71e047ad01d8d1f2aafebb390b1585d Parents: e47c26b Author: Alexey Kuznetsov <[email protected]> Authored: Mon Aug 24 16:30:52 2015 +0700 Committer: Alexey Kuznetsov <[email protected]> Committed: Mon Aug 24 16:30:52 2015 +0700 ---------------------------------------------------------------------- .../ignite/agent/remote/RemoteHandler.java | 3 +- .../test-drive/test-drive.sql | 44 +++++++---- .../src/main/js/agents/agent-manager.js | 17 +++- .../main/js/controllers/metadata-controller.js | 83 ++++++++++++++++---- .../src/main/js/public/stylesheets/style.scss | 4 + .../src/main/js/routes/agent.js | 24 +++++- .../js/views/configuration/metadata-load.jade | 35 +++++++-- 7 files changed, 166 insertions(+), 44 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/f155bcea/modules/control-center-agent/src/main/java/org/apache/ignite/agent/remote/RemoteHandler.java ---------------------------------------------------------------------- diff --git a/modules/control-center-agent/src/main/java/org/apache/ignite/agent/remote/RemoteHandler.java b/modules/control-center-agent/src/main/java/org/apache/ignite/agent/remote/RemoteHandler.java index 2ef9292..e970470 100644 --- a/modules/control-center-agent/src/main/java/org/apache/ignite/agent/remote/RemoteHandler.java +++ b/modules/control-center-agent/src/main/java/org/apache/ignite/agent/remote/RemoteHandler.java @@ -76,8 +76,7 @@ public class RemoteHandler implements AutoCloseable { * @param req Request. */ public void onMessage(JsonObject req) { - if (log.isLoggable(Level.FINE)) - log.fine("Message: " + req); + log.log(Level.INFO, "Message: " + req); JsonPrimitive reqIdJson = req.getAsJsonPrimitive("reqId"); http://git-wip-us.apache.org/repos/asf/ignite/blob/f155bcea/modules/control-center-agent/test-drive/test-drive.sql ---------------------------------------------------------------------- diff --git a/modules/control-center-agent/test-drive/test-drive.sql b/modules/control-center-agent/test-drive/test-drive.sql index 98cfa25..fd910fe 100644 --- a/modules/control-center-agent/test-drive/test-drive.sql +++ b/modules/control-center-agent/test-drive/test-drive.sql @@ -18,23 +18,39 @@ CREATE TABLE COUNTRY(ID INTEGER NOT NULL PRIMARY KEY, COUNTRY_NAME VARCHAR(100)); CREATE TABLE DEPARTMENT( - DEPARTMENT_ID INTEGER NOT NULL PRIMARY KEY, - DEPARTMENT_NAME VARCHAR(50) NOT NULL, - COUNTRY_ID INTEGER, - MANAGER_ID INTEGER); + DEPARTMENT_ID INTEGER NOT NULL PRIMARY KEY, + DEPARTMENT_NAME VARCHAR(50) NOT NULL, + COUNTRY_ID INTEGER, + MANAGER_ID INTEGER); CREATE TABLE EMPLOYEE( - EMPLOYEE_ID INTEGER NOT NULL PRIMARY KEY, - FIRST_NAME VARCHAR(20) NOT NULL, - LAST_NAME VARCHAR(30) NOT NULL, - EMAIL VARCHAR(25) NOT NULL, - PHONE_NUMBER VARCHAR(20), - HIRE_DATE DATE NOT NULL, - JOB VARCHAR(50) NOT NULL, - SALARY DOUBLE, - MANAGER_ID INTEGER, - DEPARTMENT_ID INTEGER); + EMPLOYEE_ID INTEGER NOT NULL PRIMARY KEY, + FIRST_NAME VARCHAR(20) NOT NULL, + LAST_NAME VARCHAR(30) NOT NULL, + EMAIL VARCHAR(25) NOT NULL, + PHONE_NUMBER VARCHAR(20), + HIRE_DATE DATE NOT NULL, + JOB VARCHAR(50) NOT NULL, + SALARY DOUBLE, + MANAGER_ID INTEGER, + DEPARTMENT_ID INTEGER); CREATE INDEX EMP_SALARY_A ON EMPLOYEE(SALARY ASC); CREATE INDEX EMP_SALARY_B ON EMPLOYEE(SALARY DESC); CREATE INDEX EMP_NAMES ON EMPLOYEE(FIRST_NAME ASC, LAST_NAME ASC); + +CREATE SCHEMA CARS; + +CREATE TABLE CARS.PARKING( + PARKING_ID INTEGER NOT NULL PRIMARY KEY, + PARKING_NAME VARCHAR(50) NOT NULL +); + +CREATE TABLE CARS.CAR( + CAR_ID INTEGER NOT NULL PRIMARY KEY, + PARKING_ID INTEGER NOT NULL, + CAR_NAME VARCHAR(50) NOT NULL +); + + + http://git-wip-us.apache.org/repos/asf/ignite/blob/f155bcea/modules/control-center-web/src/main/js/agents/agent-manager.js ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/agents/agent-manager.js b/modules/control-center-web/src/main/js/agents/agent-manager.js index 43d8f9f..2689be2 100644 --- a/modules/control-center-web/src/main/js/agents/agent-manager.js +++ b/modules/control-center-web/src/main/js/agents/agent-manager.js @@ -167,12 +167,25 @@ Client.prototype.authResult = function(error) { * @param {String} jdbcDriverClass * @param {String} jdbcUrl * @param {Object} jdbcInfo + * @param {Function} cb Callback. Take two arguments: {Object} exception, {Object} result. + * @return {Array} List of tables (see org.apache.ignite.schema.parser.DbTable java class) + */ +Client.prototype.metadataSchemas = function(jdbcDriverJarPath, jdbcDriverClass, jdbcUrl, jdbcInfo, cb) { + this._invokeRmtMethod('schemas', arguments) +}; + +/** + * @param {String} jdbcDriverJarPath + * @param {String} jdbcDriverClass + * @param {String} jdbcUrl + * @param {Object} jdbcInfo + * @param {Array} schemas * @param {Boolean} tablesOnly * @param {Function} cb Callback. Take two arguments: {Object} exception, {Object} result. * @return {Array} List of tables (see org.apache.ignite.schema.parser.DbTable java class) */ -Client.prototype.extractMetadata = function(jdbcDriverJarPath, jdbcDriverClass, jdbcUrl, jdbcInfo, tablesOnly, cb) { - this._invokeRmtMethod('extractMetadata', arguments) +Client.prototype.metadataTables = function(jdbcDriverJarPath, jdbcDriverClass, jdbcUrl, jdbcInfo, schemas, tablesOnly, cb) { + this._invokeRmtMethod('metadata', arguments) }; /** http://git-wip-us.apache.org/repos/asf/ignite/blob/f155bcea/modules/control-center-web/src/main/js/controllers/metadata-controller.js ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/controllers/metadata-controller.js b/modules/control-center-web/src/main/js/controllers/metadata-controller.js index adf88bf..ce3b880 100644 --- a/modules/control-center-web/src/main/js/controllers/metadata-controller.js +++ b/modules/control-center-web/src/main/js/controllers/metadata-controller.js @@ -49,8 +49,6 @@ controlCenterModule.controller('metadataController', [ $scope.hidePopover = $common.hidePopover; var showPopoverMessage = $common.showPopoverMessage; - - var presets = [ { db: 'oracle', @@ -95,7 +93,8 @@ controlCenterModule.controller('metadataController', [ jdbcDriverClass: '', jdbcDriverJar: '', jdbcUrl: 'jdbc:[database]', - user: 'sa' + user: 'sa', + tablesOnly: true }; var jdbcDrivers = []; @@ -182,19 +181,28 @@ controlCenterModule.controller('metadataController', [ $scope.backupItem = bak; } - $scope.loadMeta = {action: 'connect'}; - $scope.loadMeta.tables = []; + $scope.selectAllSchemas = function () { + var allSelected = $scope.loadMeta.allSchemasSelected; + + _.forEach($scope.loadMeta.schemas, function (schema) { + schema.use = allSelected; + }); + }; + + $scope.selectSchema = function () { + $scope.loadMeta.allSchemasSelected = _.every($scope.loadMeta.schemas, 'use', true); + }; - $scope.loadMeta.selectAll = function () { - var allSelected = $scope.loadMeta.allSelected; + $scope.selectAllTables = function () { + var allSelected = $scope.loadMeta.allTablesSelected; _.forEach($scope.loadMeta.tables, function (table) { table.use = allSelected; }); }; - $scope.loadMeta.select = function () { - $scope.loadMeta.allSelected = _.every($scope.loadMeta.tables, 'use', true); + $scope.selectTable = function () { + $scope.loadMeta.allTablesSelected = _.every($scope.loadMeta.tables, 'use', true); }; // Pre-fetch modal dialogs. @@ -202,6 +210,15 @@ controlCenterModule.controller('metadataController', [ // Show load metadata modal. $scope.showLoadMetadataModal = function () { + $scope.loadMeta = { + action: 'connect', + schemas: [], + allSchemasSelected: false, + tables: [], + allTablesSelected: false, + button: 'Next' + }; + // Get available JDBC drivers via agent. $http.post('/agent/drivers') .success(function (drivers) { @@ -234,24 +251,35 @@ controlCenterModule.controller('metadataController', [ }); }; - $scope.loadMetadataFromDb = function () { - $scope.preset.space = $scope.spaces[0]; - - $http.post('presets/save', $scope.preset) + function _loadSchemas() { + $http.post('/agent/schemas', $scope.preset) + .success(function (schemas) { + $scope.loadMeta.schemas = _.map(schemas, function (schema) { return {use: false, name: schema}}); + $scope.loadMeta.action = 'schemas'; + }) .error(function (errMsg) { $common.showError(errMsg); }); + } + + function _loadMetadata() { + $scope.preset.schemas = []; + _.forEach($scope.loadMeta.schemas, function (schema) { + if (schema.use) + $scope.preset.schemas.push(schema.name); + }); $http.post('/agent/metadata', $scope.preset) .success(function (tables) { $scope.loadMeta.tables = tables; $scope.loadMeta.action = 'tables'; + $scope.loadMeta.button = 'Save'; }) .error(function (errMsg) { $common.showError(errMsg); }); - }; + } function toProperCase(name) { var properName = name.toLocaleLowerCase(); @@ -291,7 +319,14 @@ controlCenterModule.controller('metadataController', [ $scope.packageName = 'org.apache.ignite'; - $scope.saveSelectedMetadata = function () { + function _saveMetadata() { + $scope.preset.space = $scope.spaces[0]; + + $http.post('presets/save', $scope.preset) + .error(function (errMsg) { + $common.showError(errMsg); + }); + loadMetaModal.hide(); _.forEach($scope.loadMeta.tables, function (table) { @@ -390,6 +425,24 @@ controlCenterModule.controller('metadataController', [ save(meta); } }); + } + + $scope.loadMetadataNext = function () { + if ($scope.loadMeta.action == 'connect') + _loadSchemas(); + else if ($scope.loadMeta.action == 'schemas') + _loadMetadata(); + else if ($scope.loadMeta.action == 'tables') + _saveMetadata(); + }; + + $scope.loadMetadataPrev = function () { + if ($scope.loadMeta.action == 'tables') { + $scope.loadMeta.action = 'schemas'; + $scope.loadMeta.button = 'Next'; + } + else if ($scope.loadMeta.action == 'schemas') + $scope.loadMeta.action = 'connect'; }; // When landing on the page, get metadatas and show them. http://git-wip-us.apache.org/repos/asf/ignite/blob/f155bcea/modules/control-center-web/src/main/js/public/stylesheets/style.scss ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/public/stylesheets/style.scss b/modules/control-center-web/src/main/js/public/stylesheets/style.scss index f307161..4de127d 100644 --- a/modules/control-center-web/src/main/js/public/stylesheets/style.scss +++ b/modules/control-center-web/src/main/js/public/stylesheets/style.scss @@ -907,6 +907,10 @@ button .caret, .btn .caret { margin-bottom: 10px; } +.metadata-content { + margin: 15px; +} + .theme-line table.sql-results { [class*="col-"] { padding-left: 0 !important; http://git-wip-us.apache.org/repos/asf/ignite/blob/f155bcea/modules/control-center-web/src/main/js/routes/agent.js ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/routes/agent.js b/modules/control-center-web/src/main/js/routes/agent.js index 4b23b2e..13b0cbe 100644 --- a/modules/control-center-web/src/main/js/routes/agent.js +++ b/modules/control-center-web/src/main/js/routes/agent.js @@ -130,14 +130,14 @@ router.post('/drivers', function (req, res) { } }); -/** Get database metadata. */ -router.post('/metadata', function (req, res) { +/** Get database schemas. */ +router.post('/schemas', function (req, res) { var client = _client(req, res); if (client) { var params = req.body; - client.extractMetadata(params.jdbcDriverJar, params.jdbcDriverClass, params.jdbcUrl, {user: params.user, password: params.password}, true, function (err, meta) { + client.metadataSchemas(params.jdbcDriverJar, params.jdbcDriverClass, params.jdbcUrl, {user: params.user, password: params.password}, function (err, meta) { if (err) return res.status(500).send(err); @@ -146,4 +146,22 @@ router.post('/metadata', function (req, res) { } }); +/** Get database metadata. */ +router.post('/metadata', function (req, res) { + var client = _client(req, res); + + if (client) { + var params = req.body; + + client.metadataTables(params.jdbcDriverJar, params.jdbcDriverClass, params.jdbcUrl, + {user: params.user, password: params.password}, params.schemas, params.tablesOnly, + function (err, meta) { + if (err) + return res.status(500).send(err); + + res.json(meta); + }); + } +}); + module.exports = router; http://git-wip-us.apache.org/repos/asf/ignite/blob/f155bcea/modules/control-center-web/src/main/js/views/configuration/metadata-load.jade ---------------------------------------------------------------------- diff --git a/modules/control-center-web/src/main/js/views/configuration/metadata-load.jade b/modules/control-center-web/src/main/js/views/configuration/metadata-load.jade index 41573a4..4e44a2f 100644 --- a/modules/control-center-web/src/main/js/views/configuration/metadata-load.jade +++ b/modules/control-center-web/src/main/js/views/configuration/metadata-load.jade @@ -22,12 +22,33 @@ include ../includes/controls #errors-container.modal-header.header button.close(type='button' ng-click='$hide()' aria-hidden='true') × h4.modal-title Load metadata from database - div(ng-show='loadMeta.action == "connect"') + .metadata-content(ng-show='loadMeta.action == "connect"') form.form-horizontal(name='loadForm' novalidate) .modal-body .settings-row(ng-repeat='field in metadataDb') +form-row-custom(['col-xs-4 col-sm-3 col-md-3'], ['col-xs-8 col-sm-9 col-md-9'], 'preset') - div(ng-show='loadMeta.action == "tables"' style='margin: 15px') + .metadata-content(ng-show='loadMeta.action == "schemas"') + table.table.table-condensed.table-stripped.metadata(st-table='displayedSchemas' st-safe-src='loadMeta.schemas') + thead + tr + th.header(colspan="2") + input.form-control(type='text' st-search='' placeholder='Filter schemas...') + tr + th(width='50px') + input(type='checkbox' ng-model='loadMeta.allSchemasSelected' ng-change='selectAllSchemas()') + th + label Schema + tbody + tr(ng-repeat='schema in displayedSchemas') + td + input(type='checkbox' ng-model='schema.use' ng-change='selectSchema()') + td + label {{::schema.name}} + tfoot + tr + td.text-right(colspan='3') + div(st-pagination st-items-by-page='10' st-displayed-pages='5') + .metadata-content(ng-show='loadMeta.action == "tables"') .settings-row label.col-sm-2.required Package: .col-sm-10 @@ -39,16 +60,15 @@ include ../includes/controls input.form-control(type='text' st-search='' placeholder='Filter tables...') tr th(width='50px') - input(type='checkbox' ng-model='loadMeta.allSelected' ng-change='loadMeta.selectAll()') + input(type='checkbox' ng-model='loadMeta.allTablesSelected' ng-change='selectAllTables()') th(width='30%') label Schema th label Table - tbody tr(ng-repeat='table in displayedTables') td - input(type='checkbox' ng-model='table.use' ng-change='loadMeta.select()') + input(type='checkbox' ng-model='table.use' ng-change='selectTable()') td label {{::table.schema}} td @@ -58,6 +78,5 @@ include ../includes/controls td.text-right(colspan='3') div(st-pagination st-items-by-page='10' st-displayed-pages='5') .modal-footer - button.btn.btn-primary(ng-show='loadMeta.action == "connect"' ng-disabled='loadForm.$invalid' ng-click='loadMetadataFromDb()') Load metadata - button.btn.btn-primary(ng-show='loadMeta.action == "tables"' ng-click='loadMeta.action = "connect"') Prev - button.btn.btn-primary(ng-show='loadMeta.action == "tables"' ng-click='saveSelectedMetadata()') Save + button.btn.btn-primary(ng-show='loadMeta.action != "connect"' ng-click='loadMetadataPrev()') Prev + button.btn.btn-primary(ng-click='loadMetadataNext()') {{loadMeta.button}}
