Skip to content

Commit c743072

Browse files
adding search query v1 to v2 conversion
1 parent f8f6fa8 commit c743072

File tree

5 files changed

+103
-16
lines changed

5 files changed

+103
-16
lines changed

src/dynamics-web-api.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -930,7 +930,7 @@ export interface SearchQueryBase {
930930
/**The search parameter value contains the term to be searched for and has a 100-character limit. For suggestions, min 3 characters in addition. */
931931
search: string;
932932
/**The default table list searches across all Dataverse search–configured tables and columns. The default list is configured by your administrator when Dataverse search is enabled. */
933-
entities?: string[] | SearchEntity[];
933+
entities?: string[] | SearchEntity[] | string;
934934
/**Filters are applied while searching data and are specified in standard OData syntax. */
935935
filter?: string;
936936
}
@@ -941,7 +941,7 @@ export interface Query extends SearchQueryBase {
941941
/**Facets support the ability to drill down into data results after they've been retrieved. */
942942
facets?: string[];
943943
/**
944-
* Specify true to return the total record count; otherwise false. The default is false.
944+
* V1. Specify true to return the total record count; otherwise false. The default is false.
945945
* @deprecated Use "count".
946946
*/
947947
returnTotalRecordCount?: boolean;
@@ -952,14 +952,14 @@ export interface Query extends SearchQueryBase {
952952
/**A list of comma-separated clauses where each clause consists of a column name followed by 'asc' (ascending, which is the default) or 'desc' (descending). This list specifies how to order the results in order of precedence. */
953953
orderBy?: string[];
954954
/**V2. Options are settings configured to search a search term. */
955-
options?: SearchOptions[];
955+
options?: SearchOptions;
956956
/**
957-
* Specifies whether any or all the search terms must be matched to count the document as a match. The default is 'any'.
957+
* V1. Specifies whether any or all the search terms must be matched to count the document as a match. The default is 'any'.
958958
* @deprecated Use "options.searchmode".
959959
*/
960960
searchMode?: SearchMode;
961961
/**
962-
* For V2, use "options.querytype". The search type specifies the syntax of a search query. Using 'simple' selects simple query syntax and 'full' selects Lucene query syntax. The default is 'simple'.
962+
* V1. The search type specifies the syntax of a search query. Using 'simple' selects simple query syntax and 'full' selects Lucene query syntax. The default is 'simple'.
963963
* @deprecated Use "options.querytype".
964964
*/
965965
searchType?: SearchType;

src/requests/search/autocomplete.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,28 @@
11
import type { IDataverseClient } from "../../client/dataverse";
22
import type { AutocompleteRequest, AutocompleteResponse } from "../../dynamics-web-api";
3-
import { copyObject, isObject } from "../../utils/Utility";
3+
import { copyObject } from "../../utils/Utility";
44
import { ErrorHelper } from "../../helpers/ErrorHelper";
55
import { InternalRequest } from "../../types";
66
import { LIBRARY_NAME } from "../constants";
7+
import { convertSearchQuery } from "./convertSearchQuery";
78

89
const FUNCTION_NAME = "autocomplete";
910
const REQUEST_NAME = `${LIBRARY_NAME}.${FUNCTION_NAME}`;
1011

1112
export async function autocomplete(request: string | AutocompleteRequest, client: IDataverseClient): Promise<AutocompleteResponse> {
1213
ErrorHelper.parameterCheck(request, REQUEST_NAME, "request");
1314

14-
const _isObject = isObject(request);
15+
const _isObject = typeof request !== "string";
1516
const parameterName = _isObject ? "request.query.search" : "term";
16-
const internalRequest: InternalRequest = _isObject ? copyObject(request) : { query: { search: request as string } };
17+
const internalRequest: InternalRequest = _isObject ? copyObject(request) : { query: { search: request } };
1718

1819
if (_isObject) ErrorHelper.parameterCheck(internalRequest.query, REQUEST_NAME, "request.query");
1920
ErrorHelper.stringParameterCheck(internalRequest.query.search, REQUEST_NAME, parameterName);
2021
ErrorHelper.maxLengthStringParameterCheck(internalRequest.query.search, REQUEST_NAME, parameterName, 100);
2122

22-
internalRequest.functionName = internalRequest.collection = "autocomplete";
23+
internalRequest.functionName = internalRequest.collection = FUNCTION_NAME;
2324
internalRequest.method = "POST";
24-
internalRequest.data = internalRequest.query;
25+
internalRequest.data = convertSearchQuery(internalRequest.query, FUNCTION_NAME, client.config);
2526
internalRequest.apiConfig = client.config.searchApi;
2627

2728
delete internalRequest.query;
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
import type { Autocomplete, Suggest, Query, SearchEntity } from "../../dynamics-web-api";
2+
import { InternalConfig } from "../../utils/Config";
3+
4+
export function convertSearchQuery(query: Query | Suggest | Autocomplete, functionName: string, config: InternalConfig) {
5+
if (!query) return query;
6+
7+
query.entities = convertEntitiesProperty(query.entities, config.searchApi?.version);
8+
if (functionName === "query") {
9+
query = convertQuery(query as Query, config.searchApi?.version);
10+
}
11+
12+
return query;
13+
}
14+
15+
function convertEntitiesProperty(entities?: string | string[] | SearchEntity[], version: string = "1.0"): string | string[] | SearchEntity[] | undefined {
16+
if (!entities) return entities;
17+
if (typeof entities === "string") {
18+
if (version !== "1.0") return entities;
19+
throw new Error(
20+
"The 'entities' property must be an array of strings in the Search API v1.0. It cannot be a string. Or set Search API version to v2.0.",
21+
);
22+
}
23+
24+
const toStringArray = (entity: string | SearchEntity) => {
25+
if (typeof entity === "string") return entity;
26+
return entity.name;
27+
};
28+
29+
const toSearchEntity = (entity: string | SearchEntity) => {
30+
if (typeof entity === "string") return { name: entity };
31+
return entity;
32+
};
33+
34+
return entities.map((entity: string | SearchEntity) => (version === "1.0" ? toStringArray(entity) : toSearchEntity(entity))) as string[] | SearchEntity[];
35+
}
36+
37+
function convertQuery(query: Query, version: string = "1.0") {
38+
const toV1 = (query: Query) => {
39+
if (query.count != null) {
40+
query.returnTotalRecordCount = query.count;
41+
delete query.count;
42+
}
43+
44+
if (query.options) {
45+
if (!query.searchMode) {
46+
query.searchMode = query.options.searchmode;
47+
}
48+
49+
if (!query.searchType) {
50+
query.searchType = query.options.querytype === "simple" ? "simple" : "full";
51+
}
52+
53+
delete query.options;
54+
}
55+
56+
return query;
57+
};
58+
59+
const toV2 = (query: Query) => {
60+
if (query.returnTotalRecordCount != null) {
61+
query.count = query.returnTotalRecordCount;
62+
delete query.returnTotalRecordCount;
63+
}
64+
65+
if (query.searchMode || query.searchType) {
66+
if (!query.options) query.options = {};
67+
68+
if (!query.options.searchmode) {
69+
query.options.searchmode = query.searchMode;
70+
}
71+
72+
if (!query.options.querytype) {
73+
query.options.querytype = query.searchType === "simple" ? "simple" : "lucene";
74+
}
75+
76+
delete query.searchMode;
77+
delete query.searchType;
78+
}
79+
80+
return query;
81+
};
82+
83+
return version === "1.0" ? toV1(query) : toV2(query);
84+
}

src/requests/search/query.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { copyObject } from "../../utils/Utility";
44
import { ErrorHelper } from "../../helpers/ErrorHelper";
55
import { InternalRequest } from "../../types";
66
import { LIBRARY_NAME } from "../constants";
7+
import { convertSearchQuery } from "./convertSearchQuery";
78

89
const FUNCTION_NAME = "search";
910
const REQUEST_NAME = `${LIBRARY_NAME}.${FUNCTION_NAME}`;
@@ -22,7 +23,7 @@ export async function query<TValue = any>(request: string | QueryRequest, client
2223
internalRequest.collection = "query";
2324
internalRequest.functionName = FUNCTION_NAME;
2425
internalRequest.method = "POST";
25-
internalRequest.data = internalRequest.query;
26+
internalRequest.data = convertSearchQuery(internalRequest.query, FUNCTION_NAME, client.config);
2627
internalRequest.apiConfig = client.config.searchApi;
2728

2829
delete internalRequest.query;

src/requests/search/suggest.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,28 @@
11
import type { IDataverseClient } from "../../client/dataverse";
22
import type { SuggestRequest, SuggestResponse } from "../../dynamics-web-api";
3-
import { copyObject, isObject } from "../../utils/Utility";
3+
import { copyObject } from "../../utils/Utility";
44
import { ErrorHelper } from "../../helpers/ErrorHelper";
55
import { InternalRequest } from "../../types";
66
import { LIBRARY_NAME } from "../constants";
7+
import { convertSearchQuery } from "./convertSearchQuery";
78

89
const FUNCTION_NAME = "suggest";
910
const REQUEST_NAME = `${LIBRARY_NAME}.${FUNCTION_NAME}`;
1011

1112
export async function suggest<TValueDocument = any>(request: string | SuggestRequest, client: IDataverseClient): Promise<SuggestResponse<TValueDocument>> {
1213
ErrorHelper.parameterCheck(request, REQUEST_NAME, "request");
1314

14-
const _isObject = isObject(request);
15+
const _isObject = typeof request !== "string";
1516
const parameterName = _isObject ? "request.query.search" : "term";
16-
const internalRequest: InternalRequest = _isObject ? copyObject(request) : { query: { search: request as string } };
17+
const internalRequest: InternalRequest = _isObject ? copyObject(request) : { query: { search: request } };
1718

1819
ErrorHelper.parameterCheck(internalRequest.query, REQUEST_NAME, "request.query");
1920
ErrorHelper.stringParameterCheck(internalRequest.query.search, REQUEST_NAME, parameterName);
2021
ErrorHelper.maxLengthStringParameterCheck(internalRequest.query.search, REQUEST_NAME, parameterName, 100);
2122

22-
internalRequest.functionName = internalRequest.collection = "suggest";
23+
internalRequest.functionName = internalRequest.collection = FUNCTION_NAME;
2324
internalRequest.method = "POST";
24-
internalRequest.data = internalRequest.query;
25+
internalRequest.data = convertSearchQuery(internalRequest.query, FUNCTION_NAME, client.config);
2526
internalRequest.apiConfig = client.config.searchApi;
2627

2728
delete internalRequest.query;

0 commit comments

Comments
 (0)