Compare commits
No commits in common. "main" and "v1.0.0" have entirely different histories.
10 changed files with 77 additions and 268 deletions
11
.eslintrc.js
11
.eslintrc.js
|
@ -1,11 +0,0 @@
|
|||
module.exports = {
|
||||
"extends": "standard",
|
||||
"plugins": [
|
||||
"standard",
|
||||
"promise",
|
||||
"jest"
|
||||
],
|
||||
"env": {
|
||||
"jest/globals": true
|
||||
}
|
||||
};
|
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -1,2 +1 @@
|
|||
node_modules
|
||||
./coverage
|
||||
|
|
16
.travis.yml
16
.travis.yml
|
@ -1,19 +1,3 @@
|
|||
env:
|
||||
global:
|
||||
- CC_TEST_REPORTER_ID=e1449b0f2e8eba8f08c56a292243145925aeb4f521e5682667ac6d704829ba4c
|
||||
- GIT_COMMITTED_AT=$(if [ "$TRAVIS_PULL_REQUEST" == "false" ]; then git log -1 --pretty=format:%ct; else git log -1 --skip 1 --pretty=format:%ct; fi)
|
||||
language: node_js
|
||||
node_js:
|
||||
- "7"
|
||||
before_script:
|
||||
- curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
|
||||
- chmod +x ./cc-test-reporter
|
||||
script:
|
||||
- npm run test
|
||||
# Preferably you will run test-reporter on branch update events. But
|
||||
# if you setup travis to build PR updates only, you don't need to run
|
||||
# the line below
|
||||
- if [ "$TRAVIS_PULL_REQUEST" == "false" ]; then ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT; fi
|
||||
# In the case where travis is setup to build PR updates only,
|
||||
# uncomment the line below
|
||||
# - ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT
|
||||
|
|
24
LICENSE
24
LICENSE
|
@ -1,24 +0,0 @@
|
|||
This is free and unencumbered software released into the public domain.
|
||||
|
||||
Anyone is free to copy, modify, publish, use, compile, sell, or
|
||||
distribute this software, either in source code form or as a compiled
|
||||
binary, for any purpose, commercial or non-commercial, and by any
|
||||
means.
|
||||
|
||||
In jurisdictions that recognize copyright laws, the author or authors
|
||||
of this software dedicate any and all copyright interest in the
|
||||
software to the public domain. We make this dedication for the benefit
|
||||
of the public at large and to the detriment of our heirs and
|
||||
successors. We intend this dedication to be an overt act of
|
||||
relinquishment in perpetuity of all present and future rights to this
|
||||
software under copyright law.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
For more information, please refer to <https://unlicense.org>
|
85
README.md
85
README.md
|
@ -1,85 +0,0 @@
|
|||
# json-query-chain
|
||||
|
||||
[](https://travis-ci.org/sharpshark28/json-query-chain) [](https://badge.fury.io/js/json-query-chain)  [](https://codeclimate.com/github/sharpshark28/json-query-chain/maintainability)
|
||||
|
||||
Chain queries onto POJOs to return precise results.
|
||||
|
||||
## Usage
|
||||
|
||||
```javascript
|
||||
import Query from 'json-query-chain';
|
||||
|
||||
let myQ = new Query(someJsonData)
|
||||
.search('isActiveUser', true)
|
||||
.results;
|
||||
```
|
||||
|
||||
### Chainable Methods
|
||||
|
||||
#### Search
|
||||
|
||||
Currently supports booleans and strings. (See [#1](https://github.com/sharpshark28/json-query-chain/issues/1) for Integer Support)
|
||||
|
||||
##### By Boolean
|
||||
|
||||
```javascript
|
||||
.search('isActiveUser', true)
|
||||
```
|
||||
|
||||
##### By String
|
||||
|
||||
```javascript
|
||||
.search('name', 'steele')
|
||||
```
|
||||
|
||||
#### Filter
|
||||
|
||||
Simpler version of search using a custom function in the chain.
|
||||
|
||||
```javascript
|
||||
.filter(a => a.age >= 21)
|
||||
```
|
||||
|
||||
##### By Key
|
||||
|
||||
```javascript
|
||||
.filterBy('age', x => x >= 21)
|
||||
```
|
||||
|
||||
#### Sort
|
||||
|
||||
##### By Boolean
|
||||
|
||||
```javascript
|
||||
.sort('isActiveUser', true)
|
||||
```
|
||||
|
||||
##### By String
|
||||
|
||||
```javascript
|
||||
.sort('name')
|
||||
```
|
||||
|
||||
##### By Number
|
||||
|
||||
```javascript
|
||||
.sort('netWorth')
|
||||
```
|
||||
|
||||
#### Pagination
|
||||
|
||||
Page 1 with 5 results per page.
|
||||
|
||||
```javascript
|
||||
.paginate(1, 5)
|
||||
```
|
||||
|
||||
Page 2 wtih default of 10 results per page.
|
||||
|
||||
```javascript
|
||||
.paginate(2)
|
||||
```
|
||||
|
||||
## Tests
|
||||
|
||||
`npm test` runs tests through Jest
|
|
@ -1 +0,0 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="114" height="20"><linearGradient id="b" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><mask id="a"><rect width="114" height="20" rx="3" fill="#fff"/></mask><g mask="url(#a)"><path fill="#555" d="M0 0h62v20H0z"/><path fill="#4C1" d="M62 0h52v20H62z"/><path fill="url(#b)" d="M0 0h114v20H0z"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,DejaVu Sans,Geneva,sans-serif" font-size="11"><text x="31" y="15" fill="#010101" fill-opacity=".3">coverage</text><text x="31" y="14">coverage</text><text x="87" y="15" fill="#010101" fill-opacity=".3">97.22%</text><text x="87" y="14">97.22%</text></g></svg>
|
Before Width: | Height: | Size: 735 B |
66
index.js
66
index.js
|
@ -1,55 +1,47 @@
|
|||
module.exports = class Query {
|
||||
constructor (data) {
|
||||
this.data = data.map(item => {
|
||||
item.sortScore = 0
|
||||
return item
|
||||
})
|
||||
}
|
||||
item.sortScore = 0;
|
||||
return item;
|
||||
});
|
||||
};
|
||||
|
||||
get results () {
|
||||
return this.data
|
||||
}
|
||||
|
||||
filter (func) {
|
||||
this.data = this.data.filter(func)
|
||||
return this
|
||||
}
|
||||
|
||||
filterBy (key, func) {
|
||||
this.data = this.data.filter(item => func(item[key]))
|
||||
return this
|
||||
}
|
||||
return this.data;
|
||||
};
|
||||
|
||||
search (key, term, score = 0) {
|
||||
switch (typeof term) {
|
||||
case 'boolean':
|
||||
this.data = this.data.filter(item => item[key] === term)
|
||||
break
|
||||
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
|
||||
let regFind = new RegExp(term, 'gi');
|
||||
let termMatches = (item[key].match(regFind) || []).length;
|
||||
item.sortScore += termMatches;
|
||||
return termMatches;
|
||||
});
|
||||
}
|
||||
return this
|
||||
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
|
||||
}
|
||||
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
|
||||
}
|
||||
}
|
||||
let min = page * perPage - perPage;
|
||||
let max = min + perPage;
|
||||
this.data = this.data.slice(min, max);
|
||||
return this;
|
||||
};
|
||||
};
|
||||
|
|
|
@ -1,109 +1,79 @@
|
|||
const Query = require('./index')
|
||||
const TestData = require('./testdata.json')
|
||||
const Query = require('./index');
|
||||
const TestData = require('./testdata.json');
|
||||
|
||||
test('should not modify passed data without chain alterations', () => {
|
||||
let query = new Query(TestData)
|
||||
.results
|
||||
.results;
|
||||
|
||||
expect(query).toMatchObject(TestData)
|
||||
})
|
||||
expect(query).toMatchObject(TestData);
|
||||
});
|
||||
|
||||
test('should paginate with default params', () => {
|
||||
let query = new Query(TestData)
|
||||
.paginate()
|
||||
.results
|
||||
.results;
|
||||
|
||||
expect(query.length).toBe(9)
|
||||
})
|
||||
expect(query.length).toBe(9);
|
||||
});
|
||||
|
||||
test('should paginate with custom page length', () => {
|
||||
let query = new Query(TestData)
|
||||
.paginate(1, 3)
|
||||
.results
|
||||
.results;
|
||||
|
||||
expect(query.length).toBe(3)
|
||||
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
|
||||
.results;
|
||||
|
||||
expect(query.length).toBe(3)
|
||||
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
|
||||
.results;
|
||||
|
||||
expect(query.length).toBe(4)
|
||||
})
|
||||
expect(query.length).toBe(4);
|
||||
});
|
||||
|
||||
test('should search by name', () => {
|
||||
test('should search by age', () => {
|
||||
let query = new Query(TestData)
|
||||
.search('name', 'steele')
|
||||
.results
|
||||
.results;
|
||||
|
||||
expect(query.length).toBe(2)
|
||||
})
|
||||
expect(query.length).toBe(2);
|
||||
});
|
||||
|
||||
test('should sort by boolean isActive', () => {
|
||||
let query = new Query(TestData)
|
||||
.sort('isActive')
|
||||
.results
|
||||
.results;
|
||||
|
||||
expect(query[0].name).toBe('Katelyn Steele')
|
||||
})
|
||||
|
||||
test('should sort by number netWorth', () => {
|
||||
let query = new Query(TestData)
|
||||
.sort('netWorth')
|
||||
.results
|
||||
|
||||
expect(query[0].name).toBe('Howard Buckley') // Negative
|
||||
expect(query[1].name).toBe('Natalia Petty') // 0
|
||||
expect(query[query.length - 1].name).toBe('Newman Mays') // Richest
|
||||
})
|
||||
expect(query[0].name).toBe('Katelyn Steele');
|
||||
});
|
||||
|
||||
test('should sort by string name', () => {
|
||||
let query = new Query(TestData)
|
||||
.sort('name')
|
||||
.results
|
||||
.results;
|
||||
|
||||
expect(query[0].name).toBe('Dudley Conner')
|
||||
})
|
||||
|
||||
test('should filter', () => {
|
||||
let isAgeOver33 = a => a.age > 33
|
||||
|
||||
let query = new Query(TestData)
|
||||
.filter(isAgeOver33)
|
||||
.results
|
||||
|
||||
expect(query[0].name).toBe('Howard Buckley')
|
||||
})
|
||||
|
||||
test('should filter by key', () => {
|
||||
let isNumGT33 = num => num > 33
|
||||
|
||||
let query = new Query(TestData)
|
||||
.filterBy('age', isNumGT33)
|
||||
.results
|
||||
|
||||
expect(query[0].name).toBe('Howard Buckley')
|
||||
})
|
||||
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
|
||||
.results;
|
||||
|
||||
expect(query.length).toBe(2)
|
||||
expect(query[0].name).toBe('Dudley Conner')
|
||||
expect(query[query.length - 1].name).toBe('Haynes Meadows')
|
||||
})
|
||||
expect(query.length).toBe(2);
|
||||
expect(query[0].name).toBe('Dudley Conner');
|
||||
expect(query[query.length - 1].name).toBe('Haynes Meadows');
|
||||
});
|
||||
|
|
18
package.json
18
package.json
|
@ -1,32 +1,22 @@
|
|||
{
|
||||
"name": "json-query-chain",
|
||||
"version": "1.1.3",
|
||||
"version": "1.0.0",
|
||||
"description": "Chain queries onto POJOs to return precise results.",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"test": "jest --coverage && npm run badge",
|
||||
"badge": "lcov-badge coverage/lcov.info -o coverage.svg",
|
||||
"lint": "eslint ./*.js"
|
||||
"test": "jest"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+ssh://git@github.com/sharpshark28/json-query-chain.git"
|
||||
},
|
||||
"author": "Ava Wroten <ava@wroten.me>",
|
||||
"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": {
|
||||
"eslint": "^4.18.1",
|
||||
"eslint-config-standard": "^11.0.0",
|
||||
"eslint-plugin-import": "^2.9.0",
|
||||
"eslint-plugin-jest": "^21.12.2",
|
||||
"eslint-plugin-node": "^6.0.0",
|
||||
"eslint-plugin-promise": "^3.6.0",
|
||||
"eslint-plugin-standard": "^3.0.1",
|
||||
"jest": "^20.0.4",
|
||||
"lcov-badge": "^1.0.4"
|
||||
"jest": "^20.0.4"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,7 +3,6 @@
|
|||
"_id": "5928038b69b33613f3577487",
|
||||
"isActive": true,
|
||||
"age": 20,
|
||||
"netWorth": 54200.49,
|
||||
"name": "Haynes Meadows",
|
||||
"tags": [
|
||||
"et",
|
||||
|
@ -19,7 +18,6 @@
|
|||
"_id": "5928038ba2400e7e09550991",
|
||||
"isActive": false,
|
||||
"age": 22,
|
||||
"netWorth": 11900,
|
||||
"name": "Katelyn Steele",
|
||||
"tags": [
|
||||
"cupidatat",
|
||||
|
@ -35,7 +33,6 @@
|
|||
"_id": "5928038bff4df5c29016be22",
|
||||
"isActive": false,
|
||||
"age": 29,
|
||||
"netWorth": 0,
|
||||
"name": "Natalia Petty",
|
||||
"tags": [
|
||||
"nulla",
|
||||
|
@ -51,7 +48,6 @@
|
|||
"_id": "5928038b496f64e646cb8d69",
|
||||
"isActive": false,
|
||||
"age": 34,
|
||||
"netWorth": -5000.2,
|
||||
"name": "Howard Buckley",
|
||||
"tags": [
|
||||
"qui",
|
||||
|
@ -67,7 +63,6 @@
|
|||
"_id": "5928038b4d214186ba1e7fa2",
|
||||
"isActive": false,
|
||||
"age": 22,
|
||||
"netWorth": 401512.99,
|
||||
"name": "Jenkins Mosley",
|
||||
"tags": [
|
||||
"adipisicing",
|
||||
|
|
Loading…
Add table
Reference in a new issue