-
Notifications
You must be signed in to change notification settings - Fork 13
/
translator.ts
80 lines (70 loc) · 2.75 KB
/
translator.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import {
debugLogger, isString, parseGeoDistanceUnit
} from '@terascope/utils';
import {
xLuceneVariables,
xLuceneTypeConfig,
GeoDistanceUnit,
ElasticsearchDSLOptions,
ElasticsearchDSLResult,
ElasticsearchDistribution
} from '@terascope/types';
import { Parser } from 'xlucene-parser';
import * as i from './interfaces';
import * as utils from './utils';
const logger = debugLogger('xlucene-translator');
export class Translator {
readonly query: string;
readonly typeConfig: xLuceneTypeConfig;
readonly variables: xLuceneVariables | undefined;
private readonly _parser: Parser;
private _defaultGeoField?: string;
private _defaultGeoSortOrder: 'asc'|'desc' = 'asc';
private _defaultGeoSortUnit: GeoDistanceUnit = 'meters';
constructor(input: string | Parser, options: i.TranslatorOptions = {}) {
this.variables = options.variables;
this.typeConfig = options.type_config || {};
if (isString(input)) {
this._parser = new Parser(input, {
type_config: this.typeConfig,
variables: options.variables,
filterNilVariables: options.filterNilVariables
});
} else {
this._parser = input;
}
if (options.variables) {
this._parser = this._parser.resolveVariables(options.variables);
}
if (options.default_geo_field) {
this._defaultGeoField = options.default_geo_field;
}
if (options.default_geo_sort_order) {
this._defaultGeoSortOrder = options.default_geo_sort_order;
}
if (options.default_geo_sort_unit) {
this._defaultGeoSortUnit = parseGeoDistanceUnit(options.default_geo_sort_unit);
}
this.query = this._parser.query;
}
toElasticsearchDSL(opts: ElasticsearchDSLOptions = {}): ElasticsearchDSLResult {
const result = utils.translateQuery(this._parser, {
logger,
majorVersion: opts.majorVersion ?? 6,
minorVersion: opts.minorVersion ?? 8,
version: opts.version ?? '6.8.6',
distribution: opts.distribution ?? ElasticsearchDistribution.elasticsearch,
type_config: this.typeConfig,
default_geo_field: this._defaultGeoField,
variables: this.variables ?? {},
geo_sort_point: opts.geo_sort_point,
geo_sort_order: opts.geo_sort_order || this._defaultGeoSortOrder,
geo_sort_unit: opts.geo_sort_unit || this._defaultGeoSortUnit,
});
if (logger.level() === 10) {
const resultStr = JSON.stringify(result, null, 2);
logger.trace(`translated ${this.query ? this.query : "''"} query to`, resultStr);
}
return result;
}
}