1
1
var is = require ( "../types/comparisons" ) ;
2
2
var Serializer = require ( "../serializer" ) ;
3
+ var canReflect = require ( "can-reflect" ) ;
3
4
4
5
function makeNew ( Constructor ) {
5
6
return function ( value ) {
@@ -45,7 +46,7 @@ addHydrateFrom("$gt", makeNew(is.GreaterThan));
45
46
addHydrateFrom ( "$gte" , makeNew ( is . GreaterThanEqual ) ) ;
46
47
addHydrateFromValues ( "$in" , makeNew ( is . In ) ) ;
47
48
addHydrateFrom ( "$lt" , makeNew ( is . LessThan ) ) ;
48
- addHydrateFrom ( "$lt " , makeNew ( is . LessThanEqual ) ) ;
49
+ addHydrateFrom ( "$lte " , makeNew ( is . LessThanEqual ) ) ;
49
50
addHydrateFromValues ( "$nin" , makeNew ( is . GreaterThan ) ) ;
50
51
51
52
@@ -66,6 +67,13 @@ var serializer = new Serializer([
66
67
[ is . GreaterThanEqual , function ( gte , serialize ) { return { $gte : serialize ( gte . value ) } ; } ] ,
67
68
[ is . LessThan , function ( lt , serialize ) { return { $lt : serialize ( lt . value ) } ; } ] ,
68
69
[ is . LessThanEqual , function ( lt , serialize ) { return { $lte : serialize ( lt . value ) } ; } ] ,
70
+ [ is . And , function ( and , serialize ) {
71
+ var obj = { } ;
72
+ and . values . forEach ( function ( clause ) {
73
+ canReflect . assignMap ( obj , serialize ( clause ) ) ;
74
+ } ) ;
75
+ return obj ;
76
+ } ]
69
77
/*[is.Or, function(or, serialize){
70
78
return {
71
79
$or: or.values.map(function(value){
@@ -87,13 +95,20 @@ module.exports = {
87
95
}
88
96
else if ( value && typeof value === "object" ) {
89
97
var keys = Object . keys ( value ) ;
90
- if ( keys . length === 1 ) {
91
- var first = keys [ 0 ] ;
92
- var hydrator = hydrateMap [ first ] ;
93
- if ( ! hydrator ) {
94
- return hydrateUnknown ( value ) ;
98
+ var allKeysAreComparisons = keys . every ( function ( key ) {
99
+ return hydrateMap [ key ]
100
+ } )
101
+ if ( allKeysAreComparisons ) {
102
+ var andClauses = keys . map ( function ( key ) {
103
+ var part = { } ;
104
+ part [ key ] = value [ key ] ;
105
+ var hydrator = hydrateMap [ key ] ;
106
+ return hydrator ( part , hydrateUnknown ) ;
107
+ } ) ;
108
+ if ( andClauses . length > 1 ) {
109
+ return new is . And ( andClauses ) ;
95
110
} else {
96
- return hydrator ( value , hydrateUnknown ) ;
111
+ return andClauses [ 0 ] ;
97
112
}
98
113
} else {
99
114
return hydrateUnknown ( value ) ;
0 commit comments