http://git-wip-us.apache.org/repos/asf/asterixdb/blob/1cb814b4/asterixdb/asterix-app/src/main/resources/dashboard/src/app/shared/reducers/index.reducer.ts
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/main/resources/dashboard/src/app/shared/reducers/index.reducer.ts
 
b/asterixdb/asterix-app/src/main/resources/dashboard/src/app/shared/reducers/index.reducer.ts
new file mode 100755
index 0000000..792abc7
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/main/resources/dashboard/src/app/shared/reducers/index.reducer.ts
@@ -0,0 +1,167 @@
+/*
+Licensed 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.
+*/
+import { Index } from '../models/asterixDB.model';
+import * as IndexAction from '../actions/index.actions';
+
+export type Action = IndexAction.All;
+
+/*
+** Interfaces for indexes in store/state
+*/
+export interface State {
+  loaded: boolean,
+  loading: boolean,
+  indexes: Index[],
+  createIndex: any[],
+  createIndexError: any[],
+  createIndexSuccess: boolean,
+  createIndexFailed: boolean,
+  dropIndex: any[],
+  dropIndexError: any[],
+  dropIndexSuccess: boolean,
+  dropIndexFailed: boolean
+};
+
+const initialState: State = {
+  loaded: false,
+  loading: false,
+  indexes: [],
+  createIndex: [],
+  createIndexError: [],
+  createIndexSuccess: false,
+  createIndexFailed: false,
+  dropIndex: [],
+  dropIndexError: [],
+  dropIndexSuccess: false,
+  dropIndexFailed: false
+};
+
+/*
+** Reducer function for indexes in store/state
+*/
+export function indexReducer(state = initialState, action: Action) {
+  switch (action.type) {
+
+    /*
+    * Change the load state to true to signaling
+    * that a SELECT Query is ongoing
+    */
+    case IndexAction.SELECT_INDEXES: {
+      return Object.assign({}, state, { loading: true });
+    }
+
+    /*
+    * Change the load state to false, and loaded to true to signaling
+    * that a SELECT Query is success and there is indexes available in the
+    * store
+    */
+    case IndexAction.SELECT_INDEXES_SUCCESS: {
+      return Object.assign({}, state, {
+        loaded: true,
+        loading: false,
+        indexes: action.payload
+      })
+    }
+
+    /*
+    * Change the load state to true to signaling
+    * that a CREATE a Index Query is ongoing
+    */
+    case IndexAction.CREATE_INDEX: {
+      return Object.assign({}, state, { 
+        createIndex: [],
+        createIndexName: action.payload,       
+        createIndexError: [],
+        createIndexSuccess: false,
+        createIndexFailed: false
+      });
+    }
+
+    /*
+    * Change the load state to false, and loaded to true to signaling
+    * that a CREATE a Index Query is success and there is datasets available 
in the
+    * store
+    */
+    case IndexAction.CREATE_INDEX_SUCCESS: {
+      return Object.assign({}, state, {
+        createIndex: [],
+        createIndexError: [],
+        createIndexSuccess: true,
+        createIndexFailed: false
+      })
+    }
+
+    /*
+    * Change the load state to false, and loaded to true to signaling
+    * that a CREATE a Index Query is success and there is datasets available 
in the
+    * store
+    */
+    case IndexAction.CREATE_INDEX_SUCCESS: {
+      return Object.assign({}, state, {
+        createIndex: action.payload,
+        createIndexError: [],
+        createIndexSuccess: false,
+        createIndexFailed: true
+      })
+    }
+
+    /*
+    * Change the load state to true to signaling
+    * that a DROP a Index Query is ongoing
+    */
+    case IndexAction.DROP_INDEX: {
+      return Object.assign({}, state, { 
+        dropIndex: [],
+        dropIndexError: [],
+        dropIndexName: action.payload,               
+        dropIndexSuccess: false,
+        dropIndexFailed: false 
+      });
+    }
+
+    /*
+    * Change the load state to false, and loaded to true to signaling
+    * that a DROP a Index Query is success and there is datasets available in 
the
+    * store
+    */
+    case IndexAction.DROP_INDEX_SUCCESS: {
+      return Object.assign({}, state, {
+        dropIndex: action.payload,
+        dropIndexError: [],
+        dropIndexSuccess: true,
+        dropIndexFailed: false 
+      })
+    }
+
+    /*
+    * Change the load state to false, and loaded to true to signaling
+    * that a DROP a Index Query is failed and there is an error message 
available in the
+    * store
+    */
+    case IndexAction.DROP_INDEX_FAIL: {
+      return Object.assign({}, state, {
+        dropIndex: [],
+        dropIndexError: action.payload,
+        dropIndexSuccess: false,
+        dropIndexFailed: true 
+      })
+    }
+
+    /*
+    * Just returns the current store/state object
+    */
+    default:
+      return state;
+  }
+}

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/1cb814b4/asterixdb/asterix-app/src/main/resources/dashboard/src/app/shared/reducers/index.ts
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/main/resources/dashboard/src/app/shared/reducers/index.ts
 
b/asterixdb/asterix-app/src/main/resources/dashboard/src/app/shared/reducers/index.ts
new file mode 100755
index 0000000..1965d8c
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/main/resources/dashboard/src/app/shared/reducers/index.ts
@@ -0,0 +1,49 @@
+/*
+Licensed 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.
+*/
+import { ActionReducer } from '@ngrx/store';
+import * as fromDataverse from './dataverse.reducer';
+import * as fromDataset from './dataset.reducer';
+import * as fromDatatype from './datatype.reducer';
+import * as fromIndex from './index.reducer';
+import * as fromQuery from './query.reducer';
+import * as fromQueryMetadata from './query-metadata.reducer';
+import * as fromMetadata from './metadata.reducer';
+import * as fromAppState from './app.reducer';
+
+/*
+** Global Interfaces store/state
+*/
+export interface ModelState {
+  dataverse: fromDataverse.State,
+  dataset: fromDataset.State,
+  datatype: fromDatatype.State,
+  index: fromIndex.State,
+  sqlQuery: fromQuery.State,
+  sqlMetadataQuery: fromQueryMetadata.State,
+  metadata: fromMetadata.State,
+  appState: fromAppState.State,
+}
+
+/*
+** Global Reducers configuration
+*/
+export const reducers = {
+  dataverse: fromDataverse.dataverseReducer,
+  dataset: fromDataset.datasetReducer,
+  datatype: fromDatatype.datatypeReducer,
+  index: fromIndex.indexReducer,
+  sqlQuery: fromQuery.sqlReducer,
+  sqlMetadataQuery: fromQueryMetadata.sqlMetadataReducer,
+  metadata: fromMetadata.metadataTreeReducer
+};

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/1cb814b4/asterixdb/asterix-app/src/main/resources/dashboard/src/app/shared/reducers/metadata.reducer.ts
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/main/resources/dashboard/src/app/shared/reducers/metadata.reducer.ts
 
b/asterixdb/asterix-app/src/main/resources/dashboard/src/app/shared/reducers/metadata.reducer.ts
new file mode 100755
index 0000000..52b88f2
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/main/resources/dashboard/src/app/shared/reducers/metadata.reducer.ts
@@ -0,0 +1,56 @@
+/*
+Licensed 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.
+*/
+import * as metadataTreeActions from '../actions/metadata.actions';
+
+export type Action = metadataTreeActions.All;
+
+/*
+** Interfaces for the metadata tree in store/state
+*/
+export interface State {
+  tree: any[],
+  loading: boolean,
+  loaded: boolean,
+};
+
+const initialState: State = {
+  tree: [],
+  loading: false,
+  loaded: false
+};
+
+export function metadataTreeReducer(state = initialState, action: Action) {
+  switch (action.type) {
+    case metadataTreeActions.UPDATE_METADATA_TREE: {
+      return Object.assign({}, state, {
+        tree: [],
+        loading: true,
+        loaded: false
+      });
+    }
+
+    case metadataTreeActions.UPDATE_METADATA_TREE_SUCCESS: {
+      return Object.assign({}, state, {
+        tree: [...state.tree, action.payload],
+        loading: false,
+        loaded: true
+      });
+    }
+    /*
+    * Just returns the current store/state object
+    */
+    default:
+      return state;
+  }
+}

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/1cb814b4/asterixdb/asterix-app/src/main/resources/dashboard/src/app/shared/reducers/query-metadata.reducer.ts
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/main/resources/dashboard/src/app/shared/reducers/query-metadata.reducer.ts
 
b/asterixdb/asterix-app/src/main/resources/dashboard/src/app/shared/reducers/query-metadata.reducer.ts
new file mode 100755
index 0000000..e360e95
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/main/resources/dashboard/src/app/shared/reducers/query-metadata.reducer.ts
@@ -0,0 +1,96 @@
+/*
+Licensed 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.
+*/
+import { AsterixDBQueryMessage } from '../models/asterixDB.model';
+import * as sqlQueryActions from '../actions/query.actions';
+
+export type Action = sqlQueryActions.All;
+
+/*
+** Interfaces for sql++ queries in store/state
+*/
+export interface State {
+  loading: boolean,
+  loaded: boolean,
+  success: boolean,
+  sqlQueryMetadataString: string,
+  sqlQueryMetadataResult: AsterixDBQueryMessage[],
+  sqlQueryMetadataError: AsterixDBQueryMessage[]
+};
+
+const initialState: State = {
+  loading: false,
+  loaded: false,
+  success: false,
+  sqlQueryMetadataString: "",
+  sqlQueryMetadataResult: [],
+  sqlQueryMetadataError: [],
+};
+
+/*
+** Reducer function for sql++ queries in store/state
+*/
+export function sqlMetadataReducer(state = initialState, action: Action) {
+  switch (action.type) {
+    /*
+    * Change the load state to true, and clear previous results
+    * to signaling that a METADATA EXECUTE a SQL++ Query is ongoing
+    */
+    case sqlQueryActions.EXECUTE_METADATA_QUERY: {
+      return Object.assign({}, state, {
+        loading: false,
+        loaded: true,
+        success: false,
+        sqlQueryMetadataString: action.payload,
+        sqlQueryMetadataResult: [],
+        sqlQueryMetadataError: []
+      });
+    }
+
+    /*
+    * Change the load state to false, and loaded to true to signaling
+    * that a  METADATA EXECUTE Query is success and there is data available in 
the
+    * store
+    */
+    case sqlQueryActions.EXECUTE_METADATA_QUERY_SUCCESS: {
+      return Object.assign({}, state, {
+        loading: false,
+        loaded: true,
+        success: true,
+        sqlQueryMetadataResult: action.payload,
+        sqlQueryMetadataError: []
+      })
+    }
+
+    /*
+    * Change the load state to false, and loaded to true to signaling
+    * that a  METADATA EXECUTE Query is failed and there is error data 
available in the
+    * store
+    */
+    case sqlQueryActions.EXECUTE_METADATA_QUERY_FAIL: {
+      return Object.assign({}, state, {
+        loading: false,
+        loaded: true,
+        success: false,
+        sqlQueryMetadataResult: [],
+        sqlQueryMetadataError: action.payload
+      })
+    }
+
+    /*
+    * Just returns the current store/state object
+    */
+    default:
+      return state;
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/1cb814b4/asterixdb/asterix-app/src/main/resources/dashboard/src/app/shared/reducers/query.reducer.ts
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/main/resources/dashboard/src/app/shared/reducers/query.reducer.ts
 
b/asterixdb/asterix-app/src/main/resources/dashboard/src/app/shared/reducers/query.reducer.ts
new file mode 100755
index 0000000..5c8ad08
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/main/resources/dashboard/src/app/shared/reducers/query.reducer.ts
@@ -0,0 +1,97 @@
+/*
+Licensed 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.
+*/
+import { AsterixDBQueryMessage } from '../models/asterixDB.model';
+import * as sqlQueryActions from '../actions/query.actions';
+
+export type Action = sqlQueryActions.All;
+
+/*
+** Interfaces for sql++ queries in store/state
+*/
+export interface State {
+  loading: boolean,
+  loaded: boolean,
+  success: boolean,
+  sqlQueryString: string,
+  sqlQueryResult: AsterixDBQueryMessage[],
+  sqlQueryError: AsterixDBQueryMessage[]
+};
+
+const initialState: State = {
+  loading: false,
+  loaded: false,
+  success: false,
+  sqlQueryString: "",
+  sqlQueryResult: [],
+  sqlQueryError: []
+};
+
+/*
+** Reducer function for sql++ queries in store/state
+*/
+export function sqlReducer(state = initialState, action: Action) {
+  switch (action.type) {
+
+    /*
+    * Change the load state to true, and clear previous results
+    * to signaling that a EXECUTE a SQL++ Query is ongoing
+    */
+    case sqlQueryActions.EXECUTE_QUERY: {
+      return Object.assign({}, state, {
+        loading: false,
+        loaded: true,
+        success: false,
+        sqlQueryString: action.payload,
+        sqlQueryResult: [],
+        sqlQueryError: []
+      });
+    }
+
+    /*
+    * Change the load state to false, and loaded to true to signaling
+    * that a EXECUTE Query is success and there is data available in the
+    * store
+    */
+    case sqlQueryActions.EXECUTE_QUERY_SUCCESS: {
+      return Object.assign({}, state, {
+        loading: false,
+        loaded: true,
+        success: true,
+        sqlQueryResult: action.payload,
+        sqlQueryError: []
+      })
+    }
+
+    /*
+    * Change the load state to false, and loaded to true to signaling
+    * that a EXECUTE Query is failed and there is error data available in the
+    * store
+    */
+    case sqlQueryActions.EXECUTE_QUERY_FAIL: {
+      return Object.assign({}, state, {
+        loading: false,
+        loaded: true,
+        success: false,
+        sqlQueryResult: [],
+        sqlQueryError: action.payload
+      })
+    }
+    
+    /*
+    * Just returns the current store/state object
+    */
+    default:
+      return state;
+  }
+}

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/1cb814b4/asterixdb/asterix-app/src/main/resources/dashboard/src/app/shared/services/app-core.service.ts
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/main/resources/dashboard/src/app/shared/services/app-core.service.ts
 
b/asterixdb/asterix-app/src/main/resources/dashboard/src/app/shared/services/app-core.service.ts
new file mode 100755
index 0000000..ed38c26
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/main/resources/dashboard/src/app/shared/services/app-core.service.ts
@@ -0,0 +1,38 @@
+/*
+Licensed 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.
+*/
+import { Injectable } from '@angular/core';
+import { Store } from '@ngrx/store';
+import * as dataverseActions from '../../shared/actions/dataverse.actions'
+import * as datasetActions from '../../shared/actions/dataset.actions'
+import * as datatypesActions from '../../shared/actions/datatype.actions'
+import * as indexesActions from '../../shared/actions/index.actions'
+import * as metadataActions from '../../shared/actions/metadata.actions'
+
+/*
+* Main application service to initialize,
+* load, set App status and initial data, and synchronize app level 
functionality
+*/
+@Injectable()
+export class AppCoreService {
+       /*
+       * Initialize and load metadata store structures
+       */
+       constructor(private store: Store<any>) {
+               console.log('AsterixDB Web Console Core Service')
+               this.store.dispatch(new dataverseActions.SelectDataverses('-'));
+               this.store.dispatch(new datasetActions.SelectDatasets('-'));
+               this.store.dispatch(new datatypesActions.SelectDatatypes('-'));
+               this.store.dispatch(new indexesActions.SelectIndexes('-'));
+       }
+}

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/1cb814b4/asterixdb/asterix-app/src/main/resources/dashboard/src/app/shared/services/async-metadata.service.ts
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/main/resources/dashboard/src/app/shared/services/async-metadata.service.ts
 
b/asterixdb/asterix-app/src/main/resources/dashboard/src/app/shared/services/async-metadata.service.ts
new file mode 100755
index 0000000..8492a54
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/main/resources/dashboard/src/app/shared/services/async-metadata.service.ts
@@ -0,0 +1,120 @@
+/*
+Licensed 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.
+*/
+import { Injectable, ApplicationRef  } from '@angular/core';
+import { Store } from '@ngrx/store';
+import { Observable } from "rxjs/Observable";
+import 'rxjs/add/operator/map';
+import 'rxjs/add/observable/from';
+import * as dataverseActions from '../../shared/actions/dataverse.actions'
+import * as datasetActions from '../../shared/actions/dataset.actions'
+import * as datatypesActions from '../../shared/actions/datatype.actions'
+import * as indexesActions from '../../shared/actions/index.actions'
+import * as metadataActions from '../../shared/actions/metadata.actions'
+
+/*
+       Metadata service watch any changes in Dataverses, Datasets, Datatypes, 
indexes
+       state in store and builds a tree state structure with 
datasets->dataverse->datatype->index relationship
+*/
+@Injectable()
+export class MetadataService {
+
+       /* Arrays to expose updated dataverses, datasets, datatypes,
+       indexes collections*/
+       dv = [];
+       ds = [];
+       dt = [];
+       idx = [];
+
+       /*
+       * contructor will initialize the store state watchers
+       */
+       constructor(private store: Store<any>, private ref: ApplicationRef ) {
+
+               /* Watching changes in dataverse collection */
+               this.store.select(s => s.dataverse.dataverses).subscribe((data: 
any) => {
+                       if (data.results) {
+                               this.dv = []
+                               for (let i = 0; i < data.results.length; i++) {
+                                               let node = { id: 0, 
DataverseName: "", Datasets:[] }
+                                               node.id = i
+                                               node.DataverseName = 
data.results[i]['DataverseName']
+                                               this.dv.push(node)
+                               }
+                               this.updateMetadataTree();
+                       }
+               })
+
+               /* Watching changes in datasets collections */
+               this.store.select(s => s.dataset.datasets).subscribe((data: 
any) => {
+                       if (data.results) {
+                               this.ds = data.results;
+                               this.updateMetadataTree();
+                       }
+               })
+
+               /* Watching changes in datatypes collections */
+               this.store.select(s => s.datatype.datatypes).subscribe((data: 
any) => {
+                       if (data.results) {
+                               this.dt = data.results;
+                               this.updateMetadataTree();
+                       }
+               })
+
+               /* Watching changes in index collections */
+               this.store.select(s => s.index.indexes).subscribe((data: any) 
=> {
+                       if (data.results) {
+                               this.idx = data.results;
+                               this.updateMetadataTree();
+                       }
+               })
+       }
+
+       /*
+       *       convenience function to update and return the metadata tree.
+       */
+       getMetadataTree(): Observable<any[]> {
+               return Observable.from(this.dv);
+       }
+         
+       updateMetadataTree() {
+       for (let i = 0; i < this.dv.length; i++) {
+               // Filling datasets
+               this.dv[i]['Datasets'] = [];
+               for (let j = 0; j < this.ds.length; j++) {
+                       if (this.ds[j]['DataverseName'] === 
this.dv[i]['DataverseName']){
+
+                               // Filling datatypes, there is one datatype per 
dataset
+                               this.ds[j]['Datatype'] = [];
+                               for (let k = 0; k < this.dt.length; k++) {
+                                       if (this.dt[k]['DatatypeName'] === 
this.ds[j]['DatatypeName']){
+                                               this.ds[j]['Datatype'] = 
this.dt[k]; // push(this.dt[k])
+                                       }
+                               }
+
+                               // Filling indexes
+                               this.ds[j]['Indexes'] = [];
+                               for (let l = 0; l < this.idx.length; l++) {
+                                       if (this.idx[l]['DatasetName'] === 
this.ds[j]['DatasetName']){
+                                               
this.ds[j]['Indexes'].push(this.idx[l])
+                                       }
+                               }
+
+                               this.dv[i]['Datasets'].push(this.ds[j])
+                       }
+               }
+       }
+
+       this.store.dispatch(new metadataActions.UpdateMetadataTree());
+       }       
+}

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/1cb814b4/asterixdb/asterix-app/src/main/resources/dashboard/src/app/shared/services/async-query.service.ts
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/main/resources/dashboard/src/app/shared/services/async-query.service.ts
 
b/asterixdb/asterix-app/src/main/resources/dashboard/src/app/shared/services/async-query.service.ts
new file mode 100755
index 0000000..e37872e
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/main/resources/dashboard/src/app/shared/services/async-query.service.ts
@@ -0,0 +1,190 @@
+/*
+Licensed 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.
+*/
+import { Injectable } from '@angular/core';
+import { HttpClient } from '@angular/common/http';
+import { Store } from '@ngrx/store';
+import { Observable } from "rxjs/Observable";
+import 'rxjs/add/operator/map';
+
+var AsterixRestApiUrl = 'http://localhost:19002/query/service'; 
+//var AsterixRestApiUrl = '/query-service'; 
+
+/*
+* SQL query service using AsterixDB REST API /query/service
+*/
+@Injectable()
+export class SQLService {
+
+       /*
+       * SQLQueryService constructor using
+       * HttpClient from Angular 4
+       */
+       constructor(private http: HttpClient) {}
+
+       /*
+       * sends a select sql++ query to return all the dataverses
+       * from AsterixDB Metadata
+       */
+       selectDataverses() : Observable<any[]> {
+                let query = "SELECT VALUE dv FROM Metadata.`Dataverse` dv"
+                return this.executeSQLQuery(query);
+       }
+
+       /*
+       * sends a select sql++ query to return all the datasets
+       * from AsterixDB Metadata
+       */
+       selectDatasets() : Observable<any[]> {
+               let query = "SELECT VALUE ds FROM Metadata.`Dataset` ds"
+               return this.executeSQLQuery(query);
+       }
+
+       /*
+       * sends a select sql++ query to return all the datatypes
+       * from AsterixDB Metadata
+       */
+       selectDatatypes() : Observable<any[]> {
+       let query = "SELECT VALUE dt FROM Metadata.`Datatype` dt"
+               return this.executeSQLQuery(query);
+       }
+
+       /*
+       * sends a select sql++ query to return all the indexes
+       * from AsterixDB Metadata
+       */
+       selectIndexes() : Observable<any[]> {
+       let query = "SELECT VALUE ix FROM Metadata.`Index` ix"
+               return this.executeSQLQuery(query);
+       }
+
+       /*
+       * creates a sql++ ddl query to create a Dataverse
+       * from AsterixDB Metadata
+       */
+       createDataverse(dataverse: string) : Observable<any[]> {
+       let ddlQuery = "CREATE DATAVERSE " + dataverse + ";";
+               return this.executeDDLSQLQuery(ddlQuery);
+       }
+
+       /*
+       * creates a sql++ ddl query to drop a Dataverse
+       * from AsterixDB Metadata
+       */
+       dropDataverse(dataverse: string) : Observable<any[]> {
+               let ddlQuery = "DROP DATAVERSE " + dataverse; // " IF EXISTS;";
+               return this.executeDDLSQLQuery(ddlQuery);
+         }
+
+       /*
+       * creates a sql++ ddl query to create a Dataset
+       * from AsterixDB Metadata
+       */
+       createDataset(dataset: string) : Observable<any[]> {
+               let ddlQuery = "CREATE DATASET " + dataset + ";";
+               return this.executeDDLSQLQuery(ddlQuery);
+       }
+
+       /*
+       * creates a sql++ ddl query to drop a Dataset
+       * from AsterixDB Metadata
+       */
+       dropDataset(dataset: string) : Observable<any[]> {
+               let ddlQuery = "DROP DATASET " + dataset; //" IF EXISTS;";
+               return this.executeDDLSQLQuery(ddlQuery);
+       }
+
+       /*
+       * creates a sql++ ddl query to create a Datatype
+       * from AsterixDB Metadata
+       */
+       createDatatype(datatype: string) : Observable<any[]> {
+       let ddlQuery = "CREATE DATATYPE " + datatype + ";";
+               return this.executeDDLSQLQuery(ddlQuery);
+       }
+
+       /*
+       * creates a sql++ ddl query to drop a Datatype
+       * from AsterixDB Metadata
+       */
+       dropDatatype(datatype: string) : Observable<any[]> {
+               let ddlQuery = "DROP TYPE " + datatype; //" IF EXISTS;";
+               return this.executeDDLSQLQuery(ddlQuery);
+       }
+
+       /*
+       * creates a sql++ ddl query to create a Index
+       * from AsterixDB Metadata
+       */
+       createIndex(index: string) : Observable<any[]> {
+               let ddlQuery = "CREATE INDEX " + index + ";";
+               return this.executeDDLSQLQuery(ddlQuery);
+       }
+
+       /*
+       * creates a sql++ ddl query to drop a Index
+       * from AsterixDB Metadata
+       */
+       dropIndex(index: string) : Observable<any[]> {
+               let ddlQuery = "DROP INDEX " + index; // + " IF EXISTS;";
+               return this.executeDDLSQLQuery(ddlQuery);
+       }
+
+       /*
+       * Executes a sql++ ddl query against AsterixDB
+       * response is a JSON object with following structure:
+                 metrics: Metrics;
+                 requestId: string;
+                 results: any[];
+                 signature: string;
+                 status: string;
+       */
+       executeDDLSQLQuery(ddlQuery: string): Observable<any[]> {
+    const apiUrl = AsterixRestApiUrl;
+               return this.http.post(apiUrl, {statement: ddlQuery})
+                       .map((response: Response) => { return response })
+                       .catch((error: any) => 
this.handleExecuteQueryError(error));
+       }
+
+       /*
+       * Executes a sql++ query against AsterixDB
+       * response is a JSON object with following structure:
+                 metrics: Metrics;
+                 requestId: string;
+                 results: any[];
+                 signature: string;
+                 status: string;
+       */
+       executeSQLQuery(query: string): Observable<any[]> {
+    const apiUrl = AsterixRestApiUrl;
+               return this.http.post(apiUrl, {statement: query})
+                       .map((response: Response) => { return response })
+                       .catch((error: any) => 
this.handleExecuteQueryError(error));
+       }
+
+       /*
+       * AsterixDB query-service API raises HTTP errors if the sql++ query has 
some
+       * syntax error, or some elements in the query are not found
+       * this function extract the error JSON object with the relevant 
information
+               response is a JSON object with following structure:
+                 metrics: Metrics;
+                 requestId: string;
+                 errors: any[];
+                 signature: string;
+                 status: string;
+       */
+       private handleExecuteQueryError(error: any): Promise<any> {
+               console.log(error)
+               return Promise.reject(error.error || error);
+       }
+}

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/1cb814b4/asterixdb/asterix-app/src/main/resources/dashboard/src/assets/asterixdb_tm.png
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/main/resources/dashboard/src/assets/asterixdb_tm.png
 
b/asterixdb/asterix-app/src/main/resources/dashboard/src/assets/asterixdb_tm.png
new file mode 100755
index 0000000..0fa2ff0
Binary files /dev/null and 
b/asterixdb/asterix-app/src/main/resources/dashboard/src/assets/asterixdb_tm.png
 differ

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/1cb814b4/asterixdb/asterix-app/src/main/resources/dashboard/src/environments/environment.prod.ts
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/main/resources/dashboard/src/environments/environment.prod.ts
 
b/asterixdb/asterix-app/src/main/resources/dashboard/src/environments/environment.prod.ts
new file mode 100755
index 0000000..ca15503
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/main/resources/dashboard/src/environments/environment.prod.ts
@@ -0,0 +1,16 @@
+/*
+Licensed 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.
+*/
+export const environment = {
+  production: true
+};

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/1cb814b4/asterixdb/asterix-app/src/main/resources/dashboard/src/environments/environment.ts
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/main/resources/dashboard/src/environments/environment.ts
 
b/asterixdb/asterix-app/src/main/resources/dashboard/src/environments/environment.ts
new file mode 100755
index 0000000..2750f0a
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/main/resources/dashboard/src/environments/environment.ts
@@ -0,0 +1,21 @@
+/*
+Licensed 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.
+*/
+// The file contents for the current environment will overwrite these during 
build.
+// The build system defaults to the dev environment which uses 
`environment.ts`, but if you do
+// `ng build --env=prod` then `environment.prod.ts` will be used instead.
+// The list of which env maps to which file can be found in 
`.angular-cli.json`.
+
+export const environment = {
+  production: false
+};

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/1cb814b4/asterixdb/asterix-app/src/main/resources/dashboard/src/favicon.ico
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/main/resources/dashboard/src/favicon.ico 
b/asterixdb/asterix-app/src/main/resources/dashboard/src/favicon.ico
new file mode 100755
index 0000000..282c28d
Binary files /dev/null and 
b/asterixdb/asterix-app/src/main/resources/dashboard/src/favicon.ico differ

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/1cb814b4/asterixdb/asterix-app/src/main/resources/dashboard/src/index.html
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/main/resources/dashboard/src/index.html 
b/asterixdb/asterix-app/src/main/resources/dashboard/src/index.html
new file mode 100755
index 0000000..8dab418
--- /dev/null
+++ b/asterixdb/asterix-app/src/main/resources/dashboard/src/index.html
@@ -0,0 +1,30 @@
+<!--/*
+Licensed 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.
+*/-->
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1, 
shrink-to-fit=no">
+    <title>AsterixDb Administration Console</title>
+    <base href="/">
+    <link rel="icon" type="image/x-icon" href="favicon.ico">
+    <link rel="stylesheet" 
href="https://fonts.googleapis.com/css?family=Roboto+Mono";>
+    <link rel="stylesheet" 
href="https://fonts.googleapis.com/css?family=Roboto:300,400,500";>
+    <link rel="stylesheet" 
href="https://fonts.googleapis.com/icon?family=Material+Icons";>
+    <link rel="stylesheet" 
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css";>
+  </head>
+  <body>
+    <awc-root></awc-root>
+  </body>
+</html>

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/1cb814b4/asterixdb/asterix-app/src/main/resources/dashboard/src/main.scss
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/main/resources/dashboard/src/main.scss 
b/asterixdb/asterix-app/src/main/resources/dashboard/src/main.scss
new file mode 100755
index 0000000..cc02584
--- /dev/null
+++ b/asterixdb/asterix-app/src/main/resources/dashboard/src/main.scss
@@ -0,0 +1,29 @@
+/*
+Licensed 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.
+*/
+@import './styles/general';
+
+// Include material core styles.
+@import '~@angular/material/theming';
+@include mat-core();
+
+// Define the light theme.
+$primary: mat-palette($mat-grey);
+$accent:  mat-palette($mat-orange, A200, A100, A400);
+
+$theme: mat-light-theme($primary, $accent);
+@include angular-material-theme($theme);
+
+* {
+    font-family: Roboto, "Helvetica Neue", sans-serif;
+  }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/1cb814b4/asterixdb/asterix-app/src/main/resources/dashboard/src/main.ts
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/main/resources/dashboard/src/main.ts 
b/asterixdb/asterix-app/src/main/resources/dashboard/src/main.ts
new file mode 100755
index 0000000..446a9dc
--- /dev/null
+++ b/asterixdb/asterix-app/src/main/resources/dashboard/src/main.ts
@@ -0,0 +1,26 @@
+/*
+Licensed 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.
+*/
+import './polyfills.ts';
+import 'hammerjs';
+import { enableProdMode } from '@angular/core';
+import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
+import { AppModule } from './app/app.module';
+import { environment } from './environments/environment';
+
+if (environment.production) {
+  enableProdMode();
+}
+
+platformBrowserDynamic().bootstrapModule(AppModule)
+  .catch(err => console.log(err));

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/1cb814b4/asterixdb/asterix-app/src/main/resources/dashboard/src/polyfills.ts
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/main/resources/dashboard/src/polyfills.ts 
b/asterixdb/asterix-app/src/main/resources/dashboard/src/polyfills.ts
new file mode 100755
index 0000000..20d4075
--- /dev/null
+++ b/asterixdb/asterix-app/src/main/resources/dashboard/src/polyfills.ts
@@ -0,0 +1,76 @@
+/**
+ * This file includes polyfills needed by Angular and is loaded before the app.
+ * You can add your own extra polyfills to this file.
+ *
+ * This file is divided into 2 sections:
+ *   1. Browser polyfills. These are applied before loading ZoneJS and are 
sorted by browsers.
+ *   2. Application imports. Files imported after ZoneJS that should be loaded 
before your main
+ *      file.
+ *
+ * The current setup is for so-called "evergreen" browsers; the last versions 
of browsers that
+ * automatically update themselves. This includes Safari >= 10, Chrome >= 55 
(including Opera),
+ * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile.
+ *
+ * Learn more in https://angular.io/docs/ts/latest/guide/browser-support.html
+ */
+
+/***************************************************************************************************
+ * BROWSER POLYFILLS
+ */
+
+/** IE9, IE10 and IE11 requires all of the following polyfills. **/
+// import 'core-js/es6/symbol';
+// import 'core-js/es6/object';
+// import 'core-js/es6/function';
+// import 'core-js/es6/parse-int';
+// import 'core-js/es6/parse-float';
+// import 'core-js/es6/number';
+// import 'core-js/es6/math';
+// import 'core-js/es6/string';
+// import 'core-js/es6/date';
+// import 'core-js/es6/array';
+// import 'core-js/es6/regexp';
+// import 'core-js/es6/map';
+// import 'core-js/es6/weak-map';
+// import 'core-js/es6/set';
+
+/** IE10 and IE11 requires the following for NgClass support on SVG elements */
+// import 'classlist.js';  // Run `npm install --save classlist.js`.
+
+/** IE10 and IE11 requires the following for the Reflect API. */
+// import 'core-js/es6/reflect';
+
+
+/** Evergreen browsers require these. **/
+// Used for reflect-metadata in JIT. If you use AOT (and only Angular 
decorators), you can remove.
+import 'core-js/es7/reflect';
+
+
+/**
+ * Required to support Web Animations `@angular/platform-browser/animations`.
+ * Needed for: All but Chrome, Firefox and Opera. 
http://caniuse.com/#feat=web-animation
+ **/
+// import 'web-animations-js';  // Run `npm install --save web-animations-js`.
+
+
+
+/***************************************************************************************************
+ * Zone JS is required by Angular itself.
+ */
+import 'zone.js/dist/zone';  // Included with Angular CLI.
+
+
+
+/***************************************************************************************************
+ * APPLICATION IMPORTS
+ */
+
+/**
+ * Date, currency, decimal and percent pipes.
+ * Needed for: All but Chrome, Firefox, Edge, IE11 and Safari 10
+ */
+// import 'intl';  // Run `npm install --save intl`.
+/**
+ * Need to import at least one locale-data with intl.
+ */
+// import 'intl/locale-data/jsonp/en';

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/1cb814b4/asterixdb/asterix-app/src/main/resources/dashboard/src/styles/_constants.scss
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/main/resources/dashboard/src/styles/_constants.scss 
b/asterixdb/asterix-app/src/main/resources/dashboard/src/styles/_constants.scss
new file mode 100755
index 0000000..b3a5d07
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/main/resources/dashboard/src/styles/_constants.scss
@@ -0,0 +1,21 @@
+/*
+Licensed 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.
+*/
+@import '../../node_modules/@angular/material/theming';
+
+$small-breakpoint-width: 720px;
+
+/* For desktop, the content should be aligned with the page title. */
+$content-padding-side: 70px;
+$content-padding-side-xs: 15px;
+$awc-spacing-unit: 8px;

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/1cb814b4/asterixdb/asterix-app/src/main/resources/dashboard/src/styles/_general.scss
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/main/resources/dashboard/src/styles/_general.scss 
b/asterixdb/asterix-app/src/main/resources/dashboard/src/styles/_general.scss
new file mode 100755
index 0000000..9691cf8
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/main/resources/dashboard/src/styles/_general.scss
@@ -0,0 +1,32 @@
+/*
+Licensed 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.
+*/
+html {
+  box-sizing: border-box;
+}
+
+body {
+  font-family: "Roboto Mono", monospace;
+  font-size: 0.80rem;
+       font-weight: 500;
+}
+
+// Tree and table styling
+
+.ui-datatable{
+  //overflow : auto
+}
+
+.ui-datatable .ui-sortable-column div.ui-dt-c {
+  padding-right: 15px !important;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/1cb814b4/asterixdb/asterix-app/src/main/resources/dashboard/src/test.ts
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/main/resources/dashboard/src/test.ts 
b/asterixdb/asterix-app/src/main/resources/dashboard/src/test.ts
new file mode 100755
index 0000000..6edcb85
--- /dev/null
+++ b/asterixdb/asterix-app/src/main/resources/dashboard/src/test.ts
@@ -0,0 +1,46 @@
+/*
+Licensed 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.
+*/
+
+// This file is required by karma.conf.js and loads recursively all the .spec 
and framework files
+
+import 'zone.js/dist/long-stack-trace-zone';
+import 'zone.js/dist/proxy.js';
+import 'zone.js/dist/sync-test';
+import 'zone.js/dist/jasmine-patch';
+import 'zone.js/dist/async-test';
+import 'zone.js/dist/fake-async-test';
+import { getTestBed } from '@angular/core/testing';
+import {
+  BrowserDynamicTestingModule,
+  platformBrowserDynamicTesting
+} from '@angular/platform-browser-dynamic/testing';
+
+// Unfortunately there's no typing for the `__karma__` variable. Just declare 
it as any.
+declare const __karma__: any;
+declare const require: any;
+
+// Prevent Karma from running prematurely.
+__karma__.loaded = function () {};
+
+// First, initialize the Angular testing environment.
+getTestBed().initTestEnvironment(
+  BrowserDynamicTestingModule,
+  platformBrowserDynamicTesting()
+);
+// Then we find all the tests.
+const context = require.context('./', true, /\.spec\.ts$/);
+// And load the modules.
+context.keys().map(context);
+// Finally, start Karma to run the tests.
+__karma__.start();

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/1cb814b4/asterixdb/asterix-app/src/main/resources/dashboard/src/tsconfig.app.json
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/main/resources/dashboard/src/tsconfig.app.json 
b/asterixdb/asterix-app/src/main/resources/dashboard/src/tsconfig.app.json
new file mode 100755
index 0000000..54434df
--- /dev/null
+++ b/asterixdb/asterix-app/src/main/resources/dashboard/src/tsconfig.app.json
@@ -0,0 +1,26 @@
+/*
+Licensed 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.
+*/
+{
+  "extends": "../tsconfig.json",
+  "compilerOptions": {
+    "outDir": "../out-tsc/app",
+    "baseUrl": "./",
+    "module": "es2015",
+    "types": []
+  },
+  "exclude": [
+    "test.ts",
+    "**/*.spec.ts"
+  ]
+}

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/1cb814b4/asterixdb/asterix-app/src/main/resources/dashboard/src/tsconfig.spec.json
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/main/resources/dashboard/src/tsconfig.spec.json 
b/asterixdb/asterix-app/src/main/resources/dashboard/src/tsconfig.spec.json
new file mode 100755
index 0000000..15bcf37
--- /dev/null
+++ b/asterixdb/asterix-app/src/main/resources/dashboard/src/tsconfig.spec.json
@@ -0,0 +1,33 @@
+/*
+Licensed 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.
+*/
+{
+  "extends": "../tsconfig.json",
+  "compilerOptions": {
+    "outDir": "../out-tsc/spec",
+    "baseUrl": "./",
+    "module": "commonjs",
+    "target": "es5",
+    "types": [
+      "jasmine",
+      "node"
+    ]
+  },
+  "files": [
+    "test.ts"
+  ],
+  "include": [
+    "**/*.spec.ts",
+    "**/*.d.ts"
+  ]
+}

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/1cb814b4/asterixdb/asterix-app/src/main/resources/dashboard/src/typings.d.ts
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/main/resources/dashboard/src/typings.d.ts 
b/asterixdb/asterix-app/src/main/resources/dashboard/src/typings.d.ts
new file mode 100755
index 0000000..ef5c7bd
--- /dev/null
+++ b/asterixdb/asterix-app/src/main/resources/dashboard/src/typings.d.ts
@@ -0,0 +1,5 @@
+/* SystemJS module definition */
+declare var module: NodeModule;
+interface NodeModule {
+  id: string;
+}

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/1cb814b4/asterixdb/asterix-app/src/main/resources/dashboard/static/3rdpartylicenses.txt
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/main/resources/dashboard/static/3rdpartylicenses.txt
 
b/asterixdb/asterix-app/src/main/resources/dashboard/static/3rdpartylicenses.txt
new file mode 100644
index 0000000..03758a4
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/main/resources/dashboard/static/3rdpartylicenses.txt
@@ -0,0 +1,222 @@
+@angular/[email protected]
+MIT
+MIT
+
+@angular/[email protected]
+MIT
+MIT
+
+@angular/[email protected]
+MIT
+MIT
+
+@angular/[email protected]
+MIT
+MIT
+
+@ngrx/[email protected]
+MIT
+The MIT License (MIT)
+
+Copyright (c) 2017 Brandon Roberts, Mike Ryan, Victor Savkin, Rob Wormald
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
[email protected]
+MIT
+MIT License
+
+Copyright (C) 2017 by Marijn Haverbeke <[email protected]> and others
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
[email protected]
+MIT
+Copyright (c) 2014-2017 Denis Pushkarev
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
[email protected]
+MIT
+The MIT License
+
+Copyright © 2016 [Eli Grey][1].
+
+Permission is hereby granted, free of charge, to any person obtaining a copy 
of this software and associated documentation files (the "Software"), to deal 
in the Software without restriction, including without limitation the rights to 
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 
of the Software, and to permit persons to whom the Software is furnished to do 
so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all 
copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 
SOFTWARE.
+
+  [1]: http://eligrey.com
+
[email protected]
+MIT
+The MIT License (MIT)
+
+Copyright (C) 2011-2014 by Jorik Tangelder (Eight Media)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
[email protected]
+MIT
+The MIT License (MIT)
+
+Copyright (c) 2016-2017 PrimeTek
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+@angular/[email protected]
+MIT
+MIT
+
+@ngrx/[email protected]
+MIT
+The MIT License (MIT)
+
+Copyright (c) 2017 Brandon Roberts, Mike Ryan, Victor Savkin, Rob Wormald
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
[email protected]
+MIT
+Copyright JS Foundation and other contributors
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+'Software'), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
[email protected]
+MIT
+The MIT License
+
+Copyright (c) 2016 Google, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/1cb814b4/asterixdb/asterix-app/src/main/resources/dashboard/static/assets/asterixdb_tm.png
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/main/resources/dashboard/static/assets/asterixdb_tm.png
 
b/asterixdb/asterix-app/src/main/resources/dashboard/static/assets/asterixdb_tm.png
new file mode 100644
index 0000000..0fa2ff0
Binary files /dev/null and 
b/asterixdb/asterix-app/src/main/resources/dashboard/static/assets/asterixdb_tm.png
 differ

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/1cb814b4/asterixdb/asterix-app/src/main/resources/dashboard/static/color.c7a33805ffda0d32bd2a.png
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/main/resources/dashboard/static/color.c7a33805ffda0d32bd2a.png
 
b/asterixdb/asterix-app/src/main/resources/dashboard/static/color.c7a33805ffda0d32bd2a.png
new file mode 100644
index 0000000..561cdd9
Binary files /dev/null and 
b/asterixdb/asterix-app/src/main/resources/dashboard/static/color.c7a33805ffda0d32bd2a.png
 differ

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/1cb814b4/asterixdb/asterix-app/src/main/resources/dashboard/static/favicon.ico
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/main/resources/dashboard/static/favicon.ico 
b/asterixdb/asterix-app/src/main/resources/dashboard/static/favicon.ico
new file mode 100644
index 0000000..282c28d
Binary files /dev/null and 
b/asterixdb/asterix-app/src/main/resources/dashboard/static/favicon.ico differ

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/1cb814b4/asterixdb/asterix-app/src/main/resources/dashboard/static/index.html
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/main/resources/dashboard/static/index.html 
b/asterixdb/asterix-app/src/main/resources/dashboard/static/index.html
new file mode 100644
index 0000000..c34009b
--- /dev/null
+++ b/asterixdb/asterix-app/src/main/resources/dashboard/static/index.html
@@ -0,0 +1,13 @@
+<!--/*
+Licensed 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.
+*/--><!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" 
content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>AsterixDb 
Administration Console</title><base href="/dashboard/static/"><link rel="icon" 
type="image/x-icon" href="favicon.ico"><link rel="stylesheet" 
href="https://fonts.googleapis.com/css?family=Roboto+Mono";><link 
rel="stylesheet" 
href="https://fonts.googleapis.com/css?family=Roboto:300,400,500";><link 
rel="stylesheet" 
href="https://fonts.googleapis.com/icon?family=Material+Icons";><link 
rel="stylesheet" 
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css";><link
 href="styles.9f50282210bba5318775.bundle.css" 
rel="stylesheet"/></head><body><awc-root></awc-root><script 
type="text/javascript" 
src="inline.66bd6b83f86cf773a001.bundle.js"></script><script 
type="text/javascript" 
src="polyfills.32ca5670d6503e090789.bundle.js"></script><script 
type="text/javascript" src="scripts.da68998bdd77aff4e764.bundle.js"></s
 cript><script type="text/javascript" 
src="main.37b7b7cad656490b195a.bundle.js"></script></body></html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/1cb814b4/asterixdb/asterix-app/src/main/resources/dashboard/static/inline.66bd6b83f86cf773a001.bundle.js
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/main/resources/dashboard/static/inline.66bd6b83f86cf773a001.bundle.js
 
b/asterixdb/asterix-app/src/main/resources/dashboard/static/inline.66bd6b83f86cf773a001.bundle.js
new file mode 100644
index 0000000..1868b98
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/main/resources/dashboard/static/inline.66bd6b83f86cf773a001.bundle.js
@@ -0,0 +1 @@
+!function(e){function n(r){if(t[r])return t[r].exports;var 
o=t[r]={i:r,l:!1,exports:{}};return 
e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}var 
r=window.webpackJsonp;window.webpackJsonp=function(t,c,a){for(var 
u,i,f,l=0,s=[];l<t.length;l++)o[i=t[l]]&&s.push(o[i][0]),o[i]=0;for(u in 
c)Object.prototype.hasOwnProperty.call(c,u)&&(e[u]=c[u]);for(r&&r(t,c,a);s.length;)s.shift()();if(a)for(l=0;l<a.length;l++)f=n(n.s=a[l]);return
 f};var t={},o={3:0};n.e=function(e){function 
r(){u.onerror=u.onload=null,clearTimeout(i);var n=o[e];0!==n&&(n&&n[1](new 
Error("Loading chunk "+e+" failed.")),o[e]=void 0)}var t=o[e];if(0===t)return 
new Promise(function(e){e()});if(t)return t[2];var c=new 
Promise(function(n,r){t=o[e]=[n,r]});t[2]=c;var 
a=document.getElementsByTagName("head")[0],u=document.createElement("script");u.type="text/javascript",u.charset="utf-8",u.async=!0,u.timeout=12e4,n.nc&&u.setAttribute("nonce",n.nc),u.src=n.p+""+e+"."+{0:"37b7b7cad656490b195a",1:"32ca5670d6503e090789",2:"bd9c5
 1474f663c9da388"}[e]+".chunk.js";var i=setTimeout(r,12e4);return 
u.onerror=u.onload=r,a.appendChild(u),c},n.m=e,n.c=t,n.d=function(e,r,t){n.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:t})},n.n=function(e){var
 r=e&&e.__esModule?function(){return e.default}:function(){return e};return 
n.d(r,"a",r),r},n.o=function(e,n){return 
Object.prototype.hasOwnProperty.call(e,n)},n.p="",n.oe=function(e){throw 
console.error(e),e}}([]);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/1cb814b4/asterixdb/asterix-app/src/main/resources/dashboard/static/line.567f57385ea3dde2c9ae.gif
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/main/resources/dashboard/static/line.567f57385ea3dde2c9ae.gif
 
b/asterixdb/asterix-app/src/main/resources/dashboard/static/line.567f57385ea3dde2c9ae.gif
new file mode 100644
index 0000000..64e2280
Binary files /dev/null and 
b/asterixdb/asterix-app/src/main/resources/dashboard/static/line.567f57385ea3dde2c9ae.gif
 differ

Reply via email to