@@ -12,20 +12,25 @@ import { matchesSelector, parseField } from 'pouchdb-selector-core';
1212// the function, but it would also be a lot less performant.
1313//
1414
15+ function getDeepValue ( value , path ) {
16+ for ( const key of path ) {
17+ value = value [ key ] ;
18+ if ( value === undefined ) {
19+ return undefined ;
20+ }
21+ }
22+ return value ;
23+ }
1524
1625function createDeepMultiMapper ( fields , emit , selector ) {
1726 return function ( doc ) {
1827 if ( selector && ! matchesSelector ( doc , selector ) ) { return ; }
19- var toEmit = [ ] ;
20- for ( var i = 0 , iLen = fields . length ; i < iLen ; i ++ ) {
21- var parsedField = parseField ( fields [ i ] ) ;
22- var value = doc ;
23- for ( var j = 0 , jLen = parsedField . length ; j < jLen ; j ++ ) {
24- var key = parsedField [ j ] ;
25- value = value [ key ] ;
26- if ( typeof value === 'undefined' ) {
27- return ; // don't emit
28- }
28+
29+ const toEmit = [ ] ;
30+ for ( const field of fields ) {
31+ const value = getDeepValue ( doc , parseField ( field ) ) ;
32+ if ( value === undefined ) {
33+ return ;
2934 }
3035 toEmit . push ( value ) ;
3136 }
@@ -34,18 +39,14 @@ function createDeepMultiMapper(fields, emit, selector) {
3439}
3540
3641function createDeepSingleMapper ( field , emit , selector ) {
37- var parsedField = parseField ( field ) ;
42+ const parsedField = parseField ( field ) ;
3843 return function ( doc ) {
3944 if ( selector && ! matchesSelector ( doc , selector ) ) { return ; }
40- var value = doc ;
41- for ( var i = 0 , len = parsedField . length ; i < len ; i ++ ) {
42- var key = parsedField [ i ] ;
43- value = value [ key ] ;
44- if ( typeof value === 'undefined' ) {
45- return ; // do nothing
46- }
45+
46+ const value = getDeepValue ( doc , parsedField ) ;
47+ if ( value !== undefined ) {
48+ emit ( value ) ;
4749 }
48- emit ( value ) ;
4950 } ;
5051}
5152
@@ -59,27 +60,18 @@ function createShallowSingleMapper(field, emit, selector) {
5960function createShallowMultiMapper ( fields , emit , selector ) {
6061 return function ( doc ) {
6162 if ( selector && ! matchesSelector ( doc , selector ) ) { return ; }
62- var toEmit = [ ] ;
63- for ( var i = 0 , len = fields . length ; i < len ; i ++ ) {
64- toEmit . push ( doc [ fields [ i ] ] ) ;
65- }
63+ const toEmit = fields . map ( field => doc [ field ] ) ;
6664 emit ( toEmit ) ;
6765 } ;
6866}
6967
7068function checkShallow ( fields ) {
71- for ( var i = 0 , len = fields . length ; i < len ; i ++ ) {
72- var field = fields [ i ] ;
73- if ( field . indexOf ( '.' ) !== - 1 ) {
74- return false ;
75- }
76- }
77- return true ;
69+ return fields . every ( ( field ) => field . indexOf ( '.' ) === - 1 ) ;
7870}
7971
8072function createMapper ( fields , emit , selector ) {
81- var isShallow = checkShallow ( fields ) ;
82- var isSingle = fields . length === 1 ;
73+ const isShallow = checkShallow ( fields ) ;
74+ const isSingle = fields . length === 1 ;
8375
8476 // notice we try to optimize for the most common case,
8577 // i.e. single shallow indexes
@@ -113,18 +105,18 @@ function reducer(/*reduceFunDef*/) {
113105}
114106
115107function ddocValidator ( ddoc , viewName ) {
116- var view = ddoc . views [ viewName ] ;
108+ const view = ddoc . views [ viewName ] ;
117109 // This doesn't actually need to be here apparently, but
118110 // I feel safer keeping it.
119111 /* istanbul ignore if */
120112 if ( ! view . map || ! view . map . fields ) {
121- throw new Error ( 'ddoc ' + ddoc . _id + ' with view ' + viewName +
113+ throw new Error ( 'ddoc ' + ddoc . _id + ' with view ' + viewName +
122114 ' doesn\'t have map.fields defined. ' +
123115 'maybe it wasn\'t created by this plugin?' ) ;
124116 }
125117}
126118
127- var abstractMapper = abstractMapReduce (
119+ const abstractMapper = abstractMapReduce (
128120 /* localDocName */ 'indexes' ,
129121 mapper ,
130122 reducer ,
@@ -138,11 +130,11 @@ export default function (db) {
138130 // the standard findAbstractMapper query/viewCleanup.
139131 // This allows the indexeddb adapter to support partial_filter_selector.
140132 query : function addQueryFallback ( signature , opts ) {
141- var fallback = abstractMapper . query . bind ( this ) ;
133+ const fallback = abstractMapper . query . bind ( this ) ;
142134 return db . _customFindAbstractMapper . query . call ( this , signature , opts , fallback ) ;
143135 } ,
144136 viewCleanup : function addViewCleanupFallback ( ) {
145- var fallback = abstractMapper . viewCleanup . bind ( this ) ;
137+ const fallback = abstractMapper . viewCleanup . bind ( this ) ;
146138 return db . _customFindAbstractMapper . viewCleanup . call ( this , fallback ) ;
147139 }
148140 } ;
0 commit comments