@@ -10,6 +10,7 @@ var state = {
10
10
connectionInfo : { }
11
11
} ;
12
12
var clientKrb = null ;
13
+ const DEFAULT_NAMESPACE = 'No Namespace'
13
14
14
15
module . exports = {
15
16
connect : function ( connectionInfo , logger , cb , app ) {
@@ -73,7 +74,7 @@ module.exports = {
73
74
74
75
getNamespacesList ( connectionInfo , logger ) . then ( namespaces => {
75
76
async . mapSeries ( namespaces , ( namespace , callback ) => {
76
- getTablesList ( connectionInfo , namespace )
77
+ getTablesList ( connectionInfo , namespace , logger )
77
78
. then ( res => {
78
79
return callback ( null , res ) ;
79
80
} , ( err ) => {
@@ -238,26 +239,64 @@ function fetchRequest(query, connectionInfo, logger){
238
239
} ) ;
239
240
}
240
241
242
+ const getTableNames = ( connectionInfo , logger ) => {
243
+ let query = `${ getHostURI ( connectionInfo ) } /` ;
244
+
245
+ return fetchRequest ( query , connectionInfo , logger ) . then ( res => {
246
+ return _ . get ( res , 'table' , [ ] ) . map ( table => table . name ) ;
247
+ } ) ;
248
+ } ;
249
+
250
+ const splitTableName = name => name . indexOf ( ':' ) !== - 1 ? name . split ( ':' ) : [ '' , name ] ;
251
+
252
+ const getNamespacesFromTables = ( tables ) => {
253
+ return Promise . resolve ( _ . uniq ( tables . map ( ( tableName ) => splitTableName ( tableName || '' ) . shift ( ) ) ) ) ;
254
+ } ;
255
+
241
256
function getNamespacesList ( connectionInfo , logger ) {
242
257
let query = `${ getHostURI ( connectionInfo ) } /namespaces` ;
243
258
244
259
return fetchRequest ( query , connectionInfo , logger ) . then ( res => {
245
- return res . Namespace . filter ( item => item !== 'hbase' ) ;
260
+ return res . Namespace ;
261
+ } , err => {
262
+ const areNamespacesNotAllowed = ( err . code === 405 ) ;
263
+
264
+ if ( areNamespacesNotAllowed ) {
265
+ return getTableNames ( connectionInfo , logger ) . then ( getNamespacesFromTables ) ;
266
+ } else {
267
+ return Promise . reject ( err ) ;
268
+ }
269
+ } ) . then ( res => {
270
+ return res . filter ( item => item !== 'hbase' ) ;
246
271
} ) ;
247
272
}
248
273
249
- function getTablesList ( connectionInfo , namespace ) {
274
+ function getTablesList ( connectionInfo , namespace , logger ) {
250
275
let query = `${ getHostURI ( connectionInfo ) } /namespaces/${ namespace } /tables` ;
251
276
252
- return fetchRequest ( query , connectionInfo ) . then ( res => {
277
+ return fetchRequest ( query , connectionInfo , logger ) . then ( res => {
253
278
return res ;
279
+ } , err => {
280
+ const areNamespacesNotAllowed = ( err . code === 404 ) ;
281
+
282
+ if ( areNamespacesNotAllowed ) {
283
+ return getTableNames ( connectionInfo , logger ) . then ( filterTables . bind ( null , namespace ) ) . then ( tableNames => ( { table : tableNames } ) ) ;
284
+ } else {
285
+ return Promise . reject ( err ) ;
286
+ }
254
287
} ) ;
255
288
}
256
289
290
+ const filterTables = ( namespace , tableNames ) => {
291
+ return tableNames . map ( splitTableName )
292
+ . filter ( ( [ namespaceName ] ) => namespaceName === namespace )
293
+ . map ( ( [ ns , name ] ) => ( { name } ) ) ;
294
+ } ;
295
+
257
296
function prepareDataItems ( namespaces , items ) {
258
297
return items . map ( ( item , index ) => {
259
298
return {
260
- dbName : namespaces [ index ] ,
299
+ dbName : namespaces [ index ] || DEFAULT_NAMESPACE ,
261
300
dbCollections : item . table . map ( table => {
262
301
return table . name ;
263
302
} )
@@ -266,7 +305,7 @@ function prepareDataItems(namespaces, items){
266
305
}
267
306
268
307
function getTableSchema ( namespace , table , connectionInfo ) {
269
- let query = `${ getHostURI ( connectionInfo ) } /${ namespace } : ${ table } /schema` ;
308
+ let query = `${ getHostURI ( connectionInfo ) } /${ getNamespaceTableName ( namespace , table ) } /schema` ;
270
309
271
310
return fetchRequest ( query , connectionInfo ) . then ( res => {
272
311
return res ;
@@ -281,6 +320,8 @@ function getClusterVersion(connectionInfo, logger){
281
320
} ) ;
282
321
}
283
322
323
+ const getNamespaceTableName = ( namespace , table ) => ( namespace && namespace !== DEFAULT_NAMESPACE ) ? `${ namespace } :${ table } ` : table ;
324
+
284
325
function handleRows ( rows ) {
285
326
let data = {
286
327
hashTable : { } ,
@@ -495,7 +536,7 @@ const getScannerBody = (recordSamplingSettings) => {
495
536
} ;
496
537
497
538
const scanDocuments = ( namespace , table , recordSamplingSettings , connectionInfo ) => {
498
- const tableName = ` ${ namespace } : ${ table } ` ;
539
+ const tableName = getNamespaceTableName ( namespace , table ) ;
499
540
let query = `${ getHostURI ( connectionInfo ) } /${ tableName } /scanner` ;
500
541
501
542
return getRequestOptions ( )
0 commit comments