export function referenceQuery()

in src/QueryBuilder/typeQueries/referenceQuery.ts [13:54]


export function referenceQuery(
    compiled: CompiledSearchParam,
    value: ReferenceSearchValue,
    useKeywordSubFields: boolean,
    baseUrl: string,
    searchParamName: string,
    target: string[] = [],
    modifier?: string,
): any {
    if (modifier && !SUPPORTED_MODIFIERS.includes(modifier)) {
        throw new InvalidSearchParameterError(`Unsupported reference search modifier: ${modifier}`);
    }

    let references: string[] = [];
    switch (value.referenceType) {
        case 'idOnly':
            references = target.flatMap((targetType: string) => {
                return [`${baseUrl}/${targetType}/${value.id}`, `${targetType}/${value.id}`];
            });
            break;
        case 'relative':
            references.push(`${value.resourceType}/${value.id}`);
            references.push(`${baseUrl}/${value.resourceType}/${value.id}`);
            break;
        case 'url':
            if (value.fhirServiceBaseUrl === baseUrl) {
                references.push(`${value.resourceType}/${value.id}`);
            }
            references.push(`${value.fhirServiceBaseUrl}/${value.resourceType}/${value.id}`);
            break;
        case 'unparseable':
            references.push(value.rawValue);
            break;
        default:
            // eslint-disable-next-line no-case-declarations
            const exhaustiveCheck: never = value;
            return exhaustiveCheck;
    }

    const keywordSuffix = useKeywordSubFields ? '.keyword' : '';
    return { terms: { [`${compiled.path}.reference${keywordSuffix}`]: references } };
}