You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					108 lines
				
				2.3 KiB
			
		
		
			
		
	
	
					108 lines
				
				2.3 KiB
			| 
											3 years ago
										 | /*! | ||
|  |  * Module requirements. | ||
|  |  */ | ||
|  | 
 | ||
|  | 'use strict'; | ||
|  | 
 | ||
|  | const castArraysOfNumbers = require('./helpers').castArraysOfNumbers; | ||
|  | const castToNumber = require('./helpers').castToNumber; | ||
|  | 
 | ||
|  | /*! | ||
|  |  * ignore | ||
|  |  */ | ||
|  | 
 | ||
|  | exports.cast$geoIntersects = cast$geoIntersects; | ||
|  | exports.cast$near = cast$near; | ||
|  | exports.cast$within = cast$within; | ||
|  | 
 | ||
|  | function cast$near(val) { | ||
|  |   const SchemaArray = require('../array'); | ||
|  | 
 | ||
|  |   if (Array.isArray(val)) { | ||
|  |     castArraysOfNumbers(val, this); | ||
|  |     return val; | ||
|  |   } | ||
|  | 
 | ||
|  |   _castMinMaxDistance(this, val); | ||
|  | 
 | ||
|  |   if (val && val.$geometry) { | ||
|  |     return cast$geometry(val, this); | ||
|  |   } | ||
|  | 
 | ||
|  |   if (!Array.isArray(val)) { | ||
|  |     throw new TypeError('$near must be either an array or an object ' + | ||
|  |       'with a $geometry property'); | ||
|  |   } | ||
|  | 
 | ||
|  |   return SchemaArray.prototype.castForQuery.call(this, val); | ||
|  | } | ||
|  | 
 | ||
|  | function cast$geometry(val, self) { | ||
|  |   switch (val.$geometry.type) { | ||
|  |     case 'Polygon': | ||
|  |     case 'LineString': | ||
|  |     case 'Point': | ||
|  |       castArraysOfNumbers(val.$geometry.coordinates, self); | ||
|  |       break; | ||
|  |     default: | ||
|  |       // ignore unknowns
 | ||
|  |       break; | ||
|  |   } | ||
|  | 
 | ||
|  |   _castMinMaxDistance(self, val); | ||
|  | 
 | ||
|  |   return val; | ||
|  | } | ||
|  | 
 | ||
|  | function cast$within(val) { | ||
|  |   _castMinMaxDistance(this, val); | ||
|  | 
 | ||
|  |   if (val.$box || val.$polygon) { | ||
|  |     const type = val.$box ? '$box' : '$polygon'; | ||
|  |     val[type].forEach(arr => { | ||
|  |       if (!Array.isArray(arr)) { | ||
|  |         const msg = 'Invalid $within $box argument. ' | ||
|  |             + 'Expected an array, received ' + arr; | ||
|  |         throw new TypeError(msg); | ||
|  |       } | ||
|  |       arr.forEach((v, i) => { | ||
|  |         arr[i] = castToNumber.call(this, v); | ||
|  |       }); | ||
|  |     }); | ||
|  |   } else if (val.$center || val.$centerSphere) { | ||
|  |     const type = val.$center ? '$center' : '$centerSphere'; | ||
|  |     val[type].forEach((item, i) => { | ||
|  |       if (Array.isArray(item)) { | ||
|  |         item.forEach((v, j) => { | ||
|  |           item[j] = castToNumber.call(this, v); | ||
|  |         }); | ||
|  |       } else { | ||
|  |         val[type][i] = castToNumber.call(this, item); | ||
|  |       } | ||
|  |     }); | ||
|  |   } else if (val.$geometry) { | ||
|  |     cast$geometry(val, this); | ||
|  |   } | ||
|  | 
 | ||
|  |   return val; | ||
|  | } | ||
|  | 
 | ||
|  | function cast$geoIntersects(val) { | ||
|  |   const geo = val.$geometry; | ||
|  |   if (!geo) { | ||
|  |     return; | ||
|  |   } | ||
|  | 
 | ||
|  |   cast$geometry(val, this); | ||
|  |   return val; | ||
|  | } | ||
|  | 
 | ||
|  | function _castMinMaxDistance(self, val) { | ||
|  |   if (val.$maxDistance) { | ||
|  |     val.$maxDistance = castToNumber.call(self, val.$maxDistance); | ||
|  |   } | ||
|  |   if (val.$minDistance) { | ||
|  |     val.$minDistance = castToNumber.call(self, val.$minDistance); | ||
|  |   } | ||
|  | } |