@rcsb/rcsb-search-tools 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -0
- package/lib/SearchClient/SearchClient.js +14 -0
- package/lib/SearchFacetTools/SearchFacetInterface.js +2 -0
- package/lib/SearchFacetTools/SearchFacetTools.js +45 -0
- package/lib/SearchQueryTools/SearchQueryInterfaces.js +2 -0
- package/lib/SearchQueryTools/SearchQueryTools.js +70 -0
- package/lib/app.js +0 -0
- package/package.json +43 -0
package/README.md
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# rcsb-search-tools
|
|
2
|
+
|
|
3
|
+
RCSB Search Tools is an open-source library that includes different tools to build queries, request and parse data from the
|
|
4
|
+
[RCSB Search API](https://search.rcsb.org/).
|
|
5
|
+
|
|
6
|
+
### Node Module Instalation
|
|
7
|
+
`npm install @rcsb/rcsb-search-tools`
|
|
8
|
+
|
|
9
|
+
### Folder organization
|
|
10
|
+
- `src` module source code
|
|
11
|
+
- `SearchClient` RCSB Search API client
|
|
12
|
+
- `SearchQueryTools` Tools for building search requests
|
|
13
|
+
- `SearchParseTools` Tools for parsing RCSB Search API responses
|
|
14
|
+
- `test` Unit tests
|
|
15
|
+
|
|
16
|
+
### Examples
|
|
17
|
+
|
|
18
|
+
Multiple examples can be found in the `test` folder as part of unit tests
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SearchClient = void 0;
|
|
4
|
+
const SearchRequest_1 = require("@rcsb/rcsb-api-tools/build/RcsbSearch/SearchRequest");
|
|
5
|
+
class SearchClient {
|
|
6
|
+
static get() {
|
|
7
|
+
return this.client;
|
|
8
|
+
}
|
|
9
|
+
static set(client) {
|
|
10
|
+
this.client = client;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
SearchClient.client = new SearchRequest_1.SearchRequest();
|
|
14
|
+
exports.SearchClient = SearchClient;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getFacetsFromSearch = void 0;
|
|
4
|
+
function getFacetsFromSearch(searchResult) {
|
|
5
|
+
if (!searchResult.facets)
|
|
6
|
+
return [];
|
|
7
|
+
return getBucketsFromFacets(searchResult.facets);
|
|
8
|
+
}
|
|
9
|
+
exports.getFacetsFromSearch = getFacetsFromSearch;
|
|
10
|
+
function getBucketsFromFacets(searchResultFacets, labelList, recursiveOut) {
|
|
11
|
+
const out = recursiveOut !== null && recursiveOut !== void 0 ? recursiveOut : [];
|
|
12
|
+
const facets = collectFacets(searchResultFacets);
|
|
13
|
+
facets.forEach(bucketFacet => {
|
|
14
|
+
const innerFacets = bucketFacet.buckets.filter(g => Array.isArray(g.facets));
|
|
15
|
+
if (innerFacets.length > 0) {
|
|
16
|
+
innerFacets.forEach(g => {
|
|
17
|
+
if (g.facets)
|
|
18
|
+
getBucketsFromFacets(g.facets, labelList ? labelList.concat(g.label) : [g.label], out);
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
const searchBucketFacet = {
|
|
22
|
+
name: bucketFacet.name,
|
|
23
|
+
labelPath: labelList !== null && labelList !== void 0 ? labelList : [],
|
|
24
|
+
data: []
|
|
25
|
+
};
|
|
26
|
+
bucketFacet.buckets.forEach(bucket => {
|
|
27
|
+
if (bucket.label && bucket.population)
|
|
28
|
+
searchBucketFacet.data.push({
|
|
29
|
+
label: bucket.label,
|
|
30
|
+
population: bucket.population
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
out.push(searchBucketFacet);
|
|
34
|
+
});
|
|
35
|
+
return out;
|
|
36
|
+
}
|
|
37
|
+
function collectFacets(facets) {
|
|
38
|
+
return facets.map(f => ('value' in f ? {
|
|
39
|
+
name: f.name,
|
|
40
|
+
buckets: [{
|
|
41
|
+
label: f.name,
|
|
42
|
+
population: f.value
|
|
43
|
+
}]
|
|
44
|
+
} : f));
|
|
45
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildAttributeQuery = exports.combineSearchQuery = exports.addAttributeToSearchQuery = exports.buildRequestFromSearchQuery = exports.buildRequestFromCombinedSearchQuery = exports.buildRequestFromAttributeAndSearchQuery = exports.buildRequestFromAttribute = void 0;
|
|
4
|
+
const SearchEnums_1 = require("@rcsb/rcsb-api-tools/build/RcsbSearch/Types/SearchEnums");
|
|
5
|
+
const lodash_1 = require("lodash");
|
|
6
|
+
function buildRequestFromAttribute(searchAttribute, returnType, requestOptions) {
|
|
7
|
+
return {
|
|
8
|
+
query: buildAttributeQuery(searchAttribute),
|
|
9
|
+
return_type: returnType,
|
|
10
|
+
request_options: requestOptions
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
exports.buildRequestFromAttribute = buildRequestFromAttribute;
|
|
14
|
+
function buildRequestFromAttributeAndSearchQuery(searchAttribute, searchQuery, returnType, logicalOperator = SearchEnums_1.LogicalOperator.And, requestOptions) {
|
|
15
|
+
return {
|
|
16
|
+
query: addAttributeToSearchQuery(searchAttribute, searchQuery, logicalOperator),
|
|
17
|
+
return_type: returnType,
|
|
18
|
+
request_options: requestOptions
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
exports.buildRequestFromAttributeAndSearchQuery = buildRequestFromAttributeAndSearchQuery;
|
|
22
|
+
function buildRequestFromCombinedSearchQuery(additionalSearchQuery, searchQuery, returnType, logicalOperator = SearchEnums_1.LogicalOperator.And, requestOptions) {
|
|
23
|
+
return {
|
|
24
|
+
query: combineSearchQuery(additionalSearchQuery, searchQuery),
|
|
25
|
+
return_type: returnType,
|
|
26
|
+
request_options: requestOptions
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
exports.buildRequestFromCombinedSearchQuery = buildRequestFromCombinedSearchQuery;
|
|
30
|
+
function buildRequestFromSearchQuery(searchQuery, returnType, requestOptions) {
|
|
31
|
+
return {
|
|
32
|
+
query: searchQuery,
|
|
33
|
+
return_type: returnType,
|
|
34
|
+
request_options: requestOptions
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
exports.buildRequestFromSearchQuery = buildRequestFromSearchQuery;
|
|
38
|
+
function addAttributeToSearchQuery(searchAttribute, searchQuery, logicalOperator = SearchEnums_1.LogicalOperator.And) {
|
|
39
|
+
return combineSearchQuery(buildAttributeQuery(searchAttribute), searchQuery, logicalOperator);
|
|
40
|
+
}
|
|
41
|
+
exports.addAttributeToSearchQuery = addAttributeToSearchQuery;
|
|
42
|
+
function combineSearchQuery(additionalSearchQuery, searchQuery, logicalOperator = SearchEnums_1.LogicalOperator.And) {
|
|
43
|
+
if (searchQuery.type === SearchEnums_1.Type.Group && searchQuery.logical_operator === logicalOperator) {
|
|
44
|
+
const query = (0, lodash_1.cloneDeep)(searchQuery);
|
|
45
|
+
query.nodes.push(additionalSearchQuery);
|
|
46
|
+
return query;
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
type: SearchEnums_1.Type.Group,
|
|
50
|
+
logical_operator: logicalOperator,
|
|
51
|
+
nodes: [
|
|
52
|
+
searchQuery,
|
|
53
|
+
additionalSearchQuery
|
|
54
|
+
]
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
exports.combineSearchQuery = combineSearchQuery;
|
|
58
|
+
function buildAttributeQuery(searchAttribute) {
|
|
59
|
+
return {
|
|
60
|
+
type: SearchEnums_1.Type.Terminal,
|
|
61
|
+
service: searchAttribute.service,
|
|
62
|
+
parameters: {
|
|
63
|
+
attribute: searchAttribute.attribute,
|
|
64
|
+
negation: typeof searchAttribute.negation === "boolean" ? searchAttribute.negation : false,
|
|
65
|
+
operator: searchAttribute.operator,
|
|
66
|
+
value: searchAttribute.value
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
exports.buildAttributeQuery = buildAttributeQuery;
|
package/lib/app.js
ADDED
|
File without changes
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@rcsb/rcsb-search-tools",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "RCSB PDB Search API request tools",
|
|
5
|
+
"main": "build/app.js",
|
|
6
|
+
"files": [
|
|
7
|
+
"lib"
|
|
8
|
+
],
|
|
9
|
+
"scripts": {
|
|
10
|
+
"test": "jest",
|
|
11
|
+
"tsc": "tsc",
|
|
12
|
+
"publishApp": "npm publish"
|
|
13
|
+
},
|
|
14
|
+
"repository": {
|
|
15
|
+
"type": "git",
|
|
16
|
+
"url": "git://github.com/rcsb/rcsb-search-tools.git"
|
|
17
|
+
},
|
|
18
|
+
"publishConfig": {
|
|
19
|
+
"registry": "https://registry.npmjs.org/"
|
|
20
|
+
},
|
|
21
|
+
"author": "Joan Segura Mora",
|
|
22
|
+
"license": "MIT",
|
|
23
|
+
"devDependencies": {
|
|
24
|
+
"@babel/core": "^7.18.9",
|
|
25
|
+
"@babel/preset-env": "^7.18.9",
|
|
26
|
+
"@types/jest": "^29.5.1",
|
|
27
|
+
"@types/lodash": "^4.14.194",
|
|
28
|
+
"@types/node-fetch": "^2.6.2",
|
|
29
|
+
"babel-loader": "^9.1.2",
|
|
30
|
+
"jest": "^29.5.0",
|
|
31
|
+
"lodash": "^4.17.21",
|
|
32
|
+
"node-fetch": "^2.6.7",
|
|
33
|
+
"ts-jest": "^29.1.0",
|
|
34
|
+
"ts-loader": "^9.3.1",
|
|
35
|
+
"ts-node": "^10.9.1",
|
|
36
|
+
"typescript": "^5.0.4",
|
|
37
|
+
"webpack": "^5.74.0",
|
|
38
|
+
"webpack-cli": "^5.1.1"
|
|
39
|
+
},
|
|
40
|
+
"dependencies": {
|
|
41
|
+
"@rcsb/rcsb-api-tools": "^4.1.5"
|
|
42
|
+
}
|
|
43
|
+
}
|