Skip to content

Commit f88b213

Browse files
authored
Merge pull request #54 from CVEProject/2.1-package-test-advanced
DRAFT: Creating AdvancedSearchManager to handle SearchAPI integration
2 parents 80686c2 + 62cc767 commit f88b213

File tree

2 files changed

+147
-137
lines changed

2 files changed

+147
-137
lines changed
Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
// set up environment
2+
import * as dotenv from 'dotenv';
3+
dotenv.config();
4+
5+
import { CveResult } from '../result/CveResult.js';
6+
import { SearchResultData } from "./SearchResultData.js";
7+
import { BasicSearchManager, SearchOptions } from "./BasicSearchManager.js"
8+
9+
export class SearchAPIOptions extends SearchOptions {
10+
searchFields: Array<string>;
11+
filters: Array<object>;
12+
resultsPerPage: number;
13+
pageNumber: number;
14+
rangeObjects: Array<rangeObject>
15+
rangeStart: Date;
16+
rangeEnd: Date;
17+
rangeField: string;
18+
}
19+
20+
//support for date ranges
21+
export class rangeObject {
22+
rangeField: string;
23+
rangeStart: Date;
24+
rangeEnd: Date;
25+
}
26+
27+
export class AdvancedSearchManager extends BasicSearchManager {
28+
/** search for text at search provider
29+
* @param searchText the text string to search for
30+
* @param options options to specify how to search, with well-defined defaults
31+
* @param queryString query strings for each filter on the search request
32+
*/
33+
async apiSearch(searchText: string, options: Partial<SearchAPIOptions> = undefined, queryStrings?: Array<object>): Promise<CveResult> {
34+
let response = undefined;
35+
36+
if (!options) {
37+
options = {
38+
useCache: true,
39+
searchFields: null,
40+
filters: null,
41+
resultsPerPage: 20,
42+
pageNumber: 0,
43+
rangeObjects: null,
44+
rangeStart: null,
45+
rangeEnd: null,
46+
rangeField: null,
47+
track_total_hits: true,
48+
default_operator: "AND",
49+
metadataOnly: false,
50+
fields: []
51+
};
52+
}
53+
54+
const validateResult = this.validateSearchText(searchText, options.filters)
55+
56+
//Build range object to add to the query
57+
// let rangeObj = null;
58+
const rangeArray = [...(options.rangeObjects ?? [])];
59+
60+
// if (options.rangeObjects) {
61+
// options.rangeObjects.forEach(rangeObject => {
62+
// rangeObj = {
63+
// range: {
64+
// [rangeObject.rangeField]: {
65+
// "gte": rangeObject.rangeStart,
66+
// "lte": rangeObject.rangeEnd,
67+
// }
68+
// }
69+
// };
70+
// rangeArray.push(rangeObj);
71+
// })
72+
73+
// }
74+
//Build query object
75+
const queryObj = {
76+
must: [],
77+
filter: [
78+
...options.filters
79+
],
80+
};
81+
82+
//Add rangeObj only if it exists
83+
if (rangeArray) {
84+
queryObj.filter.push(...rangeArray);
85+
}
86+
87+
if (searchText != null) {
88+
queryObj.must = [
89+
{
90+
query_string: {
91+
query: searchText,
92+
fields: ["containers.cna.descriptions.value"]
93+
},
94+
}
95+
];
96+
}
97+
98+
//Add query_string only if there is text to search
99+
else if (queryStrings != null) {
100+
queryObj.must = [
101+
...queryStrings
102+
];
103+
} else {
104+
delete queryObj.must
105+
}
106+
107+
if (validateResult.isOk()) {
108+
109+
response = await this._searchReader._client.search({
110+
index: this._searchReader._cveIndex,
111+
body: {
112+
query: {
113+
bool: queryObj
114+
115+
},
116+
track_total_hits: true,
117+
size: options.resultsPerPage,
118+
from: options.pageNumber
119+
}
120+
});
121+
122+
return CveResult.ok(response.body as SearchResultData);
123+
}
124+
else {
125+
// return CveResult.error(new CveError(1, `Unknown error when searching for ${text}`));
126+
return validateResult
127+
}
128+
}
129+
130+
/** validates search text string and marks up CveResult
131+
* with errors and/or notes, if any
132+
*/
133+
// @todo
134+
validateSearchText(text: string, filters: Array<object>): CveResult {
135+
136+
let result: CveResult
137+
if (!text && !filters) {
138+
result = CveResult.error(9002)
139+
}
140+
else {
141+
result = CveResult.ok("", ["no validation was done"])
142+
}
143+
144+
return result
145+
}
146+
}

src/search/BasicSearchManager.ts

Lines changed: 1 addition & 137 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,10 @@
22
import * as dotenv from 'dotenv';
33
dotenv.config();
44

5-
import { CveErrorCodes, CveResult } from '../result/CveResult.js';
5+
import { CveResult } from '../result/CveResult.js';
66
import { SearchProviderSpec } from '../adapters/search/SearchAdapter.js';
77
import { SearchQueryBuilder } from './SearchQueryBuilder.js';
88
import { SearchReader } from '../adapters/search/SearchReader.js';
9-
import { SearchResultData } from "./SearchResultData.js";
109

1110

1211
/** options when using search()
@@ -21,26 +20,8 @@ export class SearchOptions {
2120
sort: {}[];
2221
from: number;
2322
size: number;
24-
25-
}
26-
27-
export class SearchAPIOptions extends SearchOptions {
28-
searchFields: Array<string>;
29-
filters: Array<object>;
30-
resultsPerPage: number;
31-
rangeObjects: Array<rangeObject>
32-
rangeStart: Date;
33-
rangeEnd: Date;
34-
rangeField: string;
3523
}
3624

37-
//support for date ranges
38-
export class rangeObject {
39-
rangeField: string;
40-
rangeStart: Date;
41-
rangeEnd: Date;
42-
43-
}
4425

4526
/** A manager class that provides basic search capabilities
4627
* including a flexible search() that provides consistent
@@ -86,121 +67,4 @@ export class BasicSearchManager {
8667
return result
8768
}
8869

89-
/** search for text at search provider
90-
* @param searchText the text string to search for
91-
* @param options options to specify how to search, with well-defined defaults
92-
*/
93-
async apiSearch(searchText: string, options: Partial<SearchAPIOptions> = undefined, queryStrings?: Array<object>): Promise<CveResult> {
94-
let response = undefined;
95-
96-
if (!options) {
97-
options = {
98-
useCache: true,
99-
searchFields: null,
100-
filters: null,
101-
resultsPerPage: 20,
102-
rangeObjects: null,
103-
rangeStart: null,
104-
rangeEnd: null,
105-
rangeField: null,
106-
track_total_hits: true,
107-
default_operator: "AND",
108-
metadataOnly: false,
109-
fields: []
110-
};
111-
}
112-
113-
let validateResult = this.validateSearchText(searchText, options.filters)
114-
115-
//Build range object to add to the query
116-
let rangeObj = null;
117-
let rangeArray = [];
118-
119-
if (options.rangeObjects) {
120-
options.rangeObjects.forEach(rangeObject => {
121-
rangeObj = {
122-
range: {
123-
[rangeObject.rangeField]: {
124-
"gte": rangeObject.rangeStart,
125-
"lte": rangeObject.rangeEnd,
126-
}
127-
}
128-
};
129-
rangeArray.push(rangeObj);
130-
})
131-
132-
}
133-
//Build query object
134-
const queryObj = {
135-
must: [],
136-
filter: [
137-
...options.filters
138-
],
139-
};
140-
141-
//Add rangeObj only if it exists
142-
if (rangeArray) {
143-
queryObj.filter.push(...rangeArray);
144-
}
145-
146-
if (searchText != null) {
147-
queryObj.must = [
148-
{
149-
query_string: {
150-
query: searchText,
151-
fields: ["containers.cna.descriptions.value"]
152-
},
153-
}
154-
];
155-
}
156-
157-
//Add query_string only if there is text to search
158-
else if (queryStrings != null) {
159-
queryObj.must = [
160-
...queryStrings
161-
];
162-
} else {
163-
delete queryObj.must
164-
}
165-
166-
if (validateResult.isOk()) {
167-
168-
response = await this._searchReader._client.search({
169-
index: this._searchReader._cveIndex,
170-
body: {
171-
query: {
172-
bool: queryObj
173-
174-
},
175-
track_total_hits: true,
176-
size: options.resultsPerPage
177-
}
178-
});
179-
180-
return CveResult.ok(response.body as SearchResultData);
181-
}
182-
else {
183-
// return CveResult.error(new CveError(1, `Unknown error when searching for ${text}`));
184-
return validateResult
185-
}
186-
}
187-
188-
/** validates search text string and marks up CveResult
189-
* with errors and/or notes, if any
190-
*/
191-
// @todo
192-
validateSearchText(text: string, filters: Array<object>): CveResult {
193-
194-
let result: CveResult
195-
if (!text && !filters) {
196-
result = CveResult.error(9002)
197-
}
198-
else {
199-
result = CveResult.ok("", ["no validation was done"])
200-
}
201-
202-
return result
203-
}
204-
205-
20670
}

0 commit comments

Comments
 (0)