1
1
2
- import Selector , { ISelector , Operators } from './Selector'
2
+ import { ISelector , Operators , Select } from './Selector'
3
3
import * as util from './utils'
4
4
5
+ /**
6
+ * Select implementation
7
+ */
5
8
export class SelectQL implements ISelector {
6
9
// The Concrete Builder
7
- selector : Selector ;
8
- selectedInput : any ;
9
- isArray : boolean = false ;
10
10
data : any = [ ] ;
11
+ private _isArray : boolean = true ;
11
12
constructor ( selectorInput : any ) {
12
13
13
14
if ( util . checkArray ( selectorInput ) || util . checkObject ( selectorInput ) ) {
14
- this . selector = new Selector ( ) ;
15
15
this . data = selectorInput ;
16
16
if ( util . checkArray ( selectorInput ) ) {
17
- this . isArray = true ;
17
+ this . _isArray = true ;
18
18
}
19
19
} else {
20
20
throw new Error ( 'Provide array or object as an input to select' ) ;
@@ -30,7 +30,7 @@ export class SelectQL implements ISelector {
30
30
* @returns extracted array like object
31
31
*/
32
32
where ( expressionKey : any , expressionOperator : Operators , expressionValue : any ) : this {
33
- let returned = this . selectedInput ;
33
+ let returned = this . data ;
34
34
35
35
// checks if any of the where clause is key/operator or value is empty
36
36
if ( util . isEmpty ( expressionKey ) || util . isEmpty ( expressionOperator ) || util . isEmpty ( expressionValue ) ) {
@@ -39,26 +39,26 @@ export class SelectQL implements ISelector {
39
39
40
40
if ( expressionOperator == Operators . EQUAL ) {
41
41
// Returned only one item where condition met
42
- returned = this . selectedInput . splice ( this . selectedInput . findIndex ( ( o ) => {
42
+ returned = this . data . splice ( this . data . findIndex ( ( o ) => {
43
43
return o [ expressionKey ] == expressionValue ;
44
44
} ) , 1 ) ;
45
45
} else if ( expressionOperator == Operators . NOT_EQUAL ) {
46
46
// Remove all element except the key mentioned
47
- returned = this . selectedInput . filter ( o => o [ expressionKey ] !== expressionValue ) ;
47
+ returned = this . data . filter ( o => o [ expressionKey ] !== expressionValue ) ;
48
48
} else if ( expressionOperator == Operators . GREATER_THAN ) {
49
- returned = this . selectedInput . filter ( o => o [ expressionKey ] > expressionValue ) ;
49
+ returned = this . data . filter ( o => o [ expressionKey ] > expressionValue ) ;
50
50
} else if ( expressionOperator == Operators . GREATER_EQUAL ) {
51
- returned = this . selectedInput . filter ( o => o [ expressionKey ] >= expressionValue ) ;
51
+ returned = this . data . filter ( o => o [ expressionKey ] >= expressionValue ) ;
52
52
} else if ( expressionOperator == Operators . LESS_THEN ) {
53
- returned = this . selectedInput . filter ( o => o [ expressionKey ] < expressionValue ) ;
53
+ returned = this . data . filter ( o => o [ expressionKey ] < expressionValue ) ;
54
54
} else if ( expressionOperator == Operators . LESS_THEN_EQUAL ) {
55
- returned = this . selectedInput . filter ( o => o [ expressionKey ] <= expressionValue ) ;
55
+ returned = this . data . filter ( o => o [ expressionKey ] <= expressionValue ) ;
56
56
}
57
57
58
58
if ( returned ) {
59
59
this . data = returned ;
60
60
// console.log(returned, 'retu');
61
- return this . data ;
61
+ return this ;
62
62
} else {
63
63
throw new Error ( 'No correct WHERE expression found!' ) ;
64
64
}
@@ -71,7 +71,8 @@ export class SelectQL implements ISelector {
71
71
*/
72
72
73
73
join ( concatWith : any ) : this {
74
- return this . data = ! util . isEmpty ( concatWith ) ? this . selectedInput . concat ( concatWith ) : this ;
74
+ this . data = ! util . isEmpty ( concatWith ) ? this . data . concat ( concatWith ) : this ;
75
+ return this ;
75
76
}
76
77
77
78
/**
@@ -82,7 +83,8 @@ export class SelectQL implements ISelector {
82
83
* @returns extracted array like object
83
84
*/
84
85
and ( expressionKey : any , expressionOperator : Operators , expressionValue : any ) : this {
85
- return this . data = this . where ( expressionKey , expressionOperator , expressionValue ) ;
86
+ this . data = this . where ( expressionKey , expressionOperator , expressionValue ) ;
87
+ return this ;
86
88
}
87
89
88
90
/**
@@ -92,30 +94,31 @@ export class SelectQL implements ISelector {
92
94
*/
93
95
uniqueByKey ( key : string ) : this {
94
96
let uniquArr : any = [ ] ;
95
- this . selectedInput . forEach ( ( value , index ) => {
97
+ this . data . forEach ( ( value , index ) => {
96
98
if ( uniquArr . indexOf ( value [ key ] ) === - 1 ) {
97
99
uniquArr . push ( value ) ;
98
100
99
101
}
100
102
} ) ;
101
- return this . data = uniquArr ;
103
+ return this ;
102
104
}
103
105
104
106
/**
105
107
* if no condition met or null then client can return it's own input/object
106
108
* @param input
107
109
* @returns client's provided input.
108
110
*/
109
- orElse ( input : any ) {
110
- return this . data = input ;
111
+ orElse ( input : any ) : this {
112
+ this . data = input ;
113
+ return this ;
111
114
}
112
115
113
116
/**
114
117
* builder function
115
118
* @returns final object.
116
119
*/
117
- build ( ) : Selector {
118
- return this . selector ;
120
+ build ( ) : Select {
121
+ return new Select ( this ) ;
119
122
}
120
123
121
124
}
0 commit comments