v1.0.0
This commit is contained in:
		
						commit
						7c75924c32
					
				
					 6 changed files with 289 additions and 0 deletions
				
			
		
							
								
								
									
										1
									
								
								.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | ||||||
|  | node_modules | ||||||
							
								
								
									
										3
									
								
								.travis.yml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								.travis.yml
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,3 @@ | ||||||
|  | language: node_js | ||||||
|  | node_js: | ||||||
|  |   - "7" | ||||||
							
								
								
									
										47
									
								
								index.js
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								index.js
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,47 @@ | ||||||
|  | module.exports = class Query { | ||||||
|  |   constructor (data) { | ||||||
|  |     this.data = data.map(item => { | ||||||
|  |       item.sortScore = 0; | ||||||
|  |       return item; | ||||||
|  |     }); | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   get results () { | ||||||
|  |     return this.data; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   search (key, term, score = 0) { | ||||||
|  |     switch (typeof term) { | ||||||
|  |       case 'boolean': | ||||||
|  |         this.data = this.data.filter(item => item[key] === term); | ||||||
|  |         break; | ||||||
|  |       case 'string': | ||||||
|  |         if (term.length >= 3) { | ||||||
|  |           this.data = this.data.filter(item => { | ||||||
|  |             let regFind = new RegExp(term, 'gi'); | ||||||
|  |             let termMatches = (item[key].match(regFind) || []).length; | ||||||
|  |             item.sortScore += termMatches; | ||||||
|  |             return termMatches; | ||||||
|  |           }); | ||||||
|  |         } | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  |     return this; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   sort (key = 'sortScore') { | ||||||
|  |     this.data = this.data.sort((a, b) => { | ||||||
|  |       if (a[key] < b[key]) return -1; | ||||||
|  |       if (a[key] > b[key]) return 1; | ||||||
|  |       return 0; | ||||||
|  |     }); | ||||||
|  |     return this; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   paginate (page = 1, perPage = 10) { | ||||||
|  |     let min = page * perPage - perPage; | ||||||
|  |     let max = min + perPage; | ||||||
|  |     this.data = this.data.slice(min, max); | ||||||
|  |     return this; | ||||||
|  |   }; | ||||||
|  | }; | ||||||
							
								
								
									
										79
									
								
								index.test.js
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								index.test.js
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,79 @@ | ||||||
|  | const Query = require('./index'); | ||||||
|  | const TestData = require('./testdata.json'); | ||||||
|  | 
 | ||||||
|  | test('should not modify passed data without chain alterations', () => { | ||||||
|  |   let query = new Query(TestData) | ||||||
|  |   .results; | ||||||
|  | 
 | ||||||
|  |   expect(query).toMatchObject(TestData); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | test('should paginate with default params', () => { | ||||||
|  |   let query = new Query(TestData) | ||||||
|  |   .paginate() | ||||||
|  |   .results; | ||||||
|  | 
 | ||||||
|  |   expect(query.length).toBe(9); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | test('should paginate with custom page length', () => { | ||||||
|  |   let query = new Query(TestData) | ||||||
|  |   .paginate(1, 3) | ||||||
|  |   .results; | ||||||
|  | 
 | ||||||
|  |   expect(query.length).toBe(3); | ||||||
|  |   expect(query[0].name).toBe('Haynes Meadows') | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | test('should paginate to second page with custom page length', () => { | ||||||
|  |   let query = new Query(TestData) | ||||||
|  |   .paginate(2, 3) | ||||||
|  |   .results; | ||||||
|  | 
 | ||||||
|  |   expect(query.length).toBe(3); | ||||||
|  |   expect(query[0].name).toBe('Howard Buckley') | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | test('should search by boolean isActive', () => { | ||||||
|  |   let query = new Query(TestData) | ||||||
|  |   .search('isActive', true) | ||||||
|  |   .results; | ||||||
|  | 
 | ||||||
|  |   expect(query.length).toBe(4); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | test('should search by name', () => { | ||||||
|  |   let query = new Query(TestData) | ||||||
|  |   .search('name', 'steele') | ||||||
|  |   .results; | ||||||
|  | 
 | ||||||
|  |   expect(query.length).toBe(2); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | test('should sort by boolean isActive', () => { | ||||||
|  |   let query = new Query(TestData) | ||||||
|  |   .sort('isActive') | ||||||
|  |   .results; | ||||||
|  | 
 | ||||||
|  |   expect(query[0].name).toBe('Katelyn Steele'); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | test('should sort by string name', () => { | ||||||
|  |   let query = new Query(TestData) | ||||||
|  |   .sort('name') | ||||||
|  |   .results; | ||||||
|  | 
 | ||||||
|  |   expect(query[0].name).toBe('Dudley Conner'); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | test('should chain everything together', () => { | ||||||
|  |   let query = new Query(TestData) | ||||||
|  |   .search('isActive', true) | ||||||
|  |   .sort('name') | ||||||
|  |   .paginate(1, 2) | ||||||
|  |   .results; | ||||||
|  | 
 | ||||||
|  |   expect(query.length).toBe(2); | ||||||
|  |   expect(query[0].name).toBe('Dudley Conner'); | ||||||
|  |   expect(query[query.length - 1].name).toBe('Haynes Meadows'); | ||||||
|  | }); | ||||||
							
								
								
									
										22
									
								
								package.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								package.json
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,22 @@ | ||||||
|  | { | ||||||
|  |   "name": "json-query-chain", | ||||||
|  |   "version": "1.0.0", | ||||||
|  |   "description": "Chain queries onto POJOs to return precise results.", | ||||||
|  |   "main": "index.js", | ||||||
|  |   "scripts": { | ||||||
|  |     "test": "jest" | ||||||
|  |   }, | ||||||
|  |   "repository": { | ||||||
|  |     "type": "git", | ||||||
|  |     "url": "git+ssh://git@github.com/sharpshark28/json-query-chain.git" | ||||||
|  |   }, | ||||||
|  |   "author": "Joe Wroten <joe@wroten.me>", | ||||||
|  |   "license": "ISC", | ||||||
|  |   "bugs": { | ||||||
|  |     "url": "https://github.com/sharpshark28/json-query-chain/issues" | ||||||
|  |   }, | ||||||
|  |   "homepage": "https://github.com/sharpshark28/json-query-chain#readme", | ||||||
|  |   "devDependencies": { | ||||||
|  |     "jest": "^20.0.4" | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										137
									
								
								testdata.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										137
									
								
								testdata.json
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,137 @@ | ||||||
|  | [ | ||||||
|  |   { | ||||||
|  |     "_id": "5928038b69b33613f3577487", | ||||||
|  |     "isActive": true, | ||||||
|  |     "age": 20, | ||||||
|  |     "name": "Haynes Meadows", | ||||||
|  |     "tags": [ | ||||||
|  |       "et", | ||||||
|  |       "enim", | ||||||
|  |       "cillum", | ||||||
|  |       "minim", | ||||||
|  |       "consequat", | ||||||
|  |       "aliquip", | ||||||
|  |       "voluptate" | ||||||
|  |     ] | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |     "_id": "5928038ba2400e7e09550991", | ||||||
|  |     "isActive": false, | ||||||
|  |     "age": 22, | ||||||
|  |     "name": "Katelyn Steele", | ||||||
|  |     "tags": [ | ||||||
|  |       "cupidatat", | ||||||
|  |       "mollit", | ||||||
|  |       "eiusmod", | ||||||
|  |       "ex", | ||||||
|  |       "officia", | ||||||
|  |       "aliquip", | ||||||
|  |       "ea" | ||||||
|  |     ] | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |     "_id": "5928038bff4df5c29016be22", | ||||||
|  |     "isActive": false, | ||||||
|  |     "age": 29, | ||||||
|  |     "name": "Natalia Petty", | ||||||
|  |     "tags": [ | ||||||
|  |       "nulla", | ||||||
|  |       "dolor", | ||||||
|  |       "anim", | ||||||
|  |       "cupidatat", | ||||||
|  |       "quis", | ||||||
|  |       "magna", | ||||||
|  |       "ea" | ||||||
|  |     ] | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |     "_id": "5928038b496f64e646cb8d69", | ||||||
|  |     "isActive": false, | ||||||
|  |     "age": 34, | ||||||
|  |     "name": "Howard Buckley", | ||||||
|  |     "tags": [ | ||||||
|  |       "qui", | ||||||
|  |       "ullamco", | ||||||
|  |       "occaecat", | ||||||
|  |       "et", | ||||||
|  |       "voluptate", | ||||||
|  |       "tempor", | ||||||
|  |       "culpa" | ||||||
|  |     ] | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |     "_id": "5928038b4d214186ba1e7fa2", | ||||||
|  |     "isActive": false, | ||||||
|  |     "age": 22, | ||||||
|  |     "name": "Jenkins Mosley", | ||||||
|  |     "tags": [ | ||||||
|  |       "adipisicing", | ||||||
|  |       "sunt", | ||||||
|  |       "officia", | ||||||
|  |       "deserunt", | ||||||
|  |       "quis", | ||||||
|  |       "nulla", | ||||||
|  |       "est" | ||||||
|  |     ] | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |     "_id": "5928038b67ae9fd2f9ba536b", | ||||||
|  |     "isActive": true, | ||||||
|  |     "age": 33, | ||||||
|  |     "name": "Keith Short", | ||||||
|  |     "tags": [ | ||||||
|  |       "deserunt", | ||||||
|  |       "cupidatat", | ||||||
|  |       "nostrud", | ||||||
|  |       "nostrud", | ||||||
|  |       "magna", | ||||||
|  |       "ex", | ||||||
|  |       "deserunt" | ||||||
|  |     ] | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |     "_id": "5928038b6b878f937b544826", | ||||||
|  |     "isActive": false, | ||||||
|  |     "age": 33, | ||||||
|  |     "name": "Wade Steele", | ||||||
|  |     "tags": [ | ||||||
|  |       "mollit", | ||||||
|  |       "dolore", | ||||||
|  |       "fugiat", | ||||||
|  |       "magna", | ||||||
|  |       "fugiat", | ||||||
|  |       "officia", | ||||||
|  |       "aute" | ||||||
|  |     ] | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |     "_id": "5928038b605e95ea58efa47a", | ||||||
|  |     "isActive": true, | ||||||
|  |     "age": 33, | ||||||
|  |     "name": "Dudley Conner", | ||||||
|  |     "tags": [ | ||||||
|  |       "aliquip", | ||||||
|  |       "aliquip", | ||||||
|  |       "reprehenderit", | ||||||
|  |       "nostrud", | ||||||
|  |       "irure", | ||||||
|  |       "sint", | ||||||
|  |       "laborum" | ||||||
|  |     ] | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |     "_id": "5928038bfece811301f276c7", | ||||||
|  |     "isActive": true, | ||||||
|  |     "age": 33, | ||||||
|  |     "name": "Newman Mays", | ||||||
|  |     "tags": [ | ||||||
|  |       "et", | ||||||
|  |       "amet", | ||||||
|  |       "dolore", | ||||||
|  |       "ipsum", | ||||||
|  |       "ea", | ||||||
|  |       "ea", | ||||||
|  |       "enim" | ||||||
|  |     ] | ||||||
|  |   } | ||||||
|  | ] | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 sharpshark28
						sharpshark28