log-search 1.0.0
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/LICENSE +21 -0
- package/README.md +226 -0
- package/bin/log-search.js +45 -0
- package/dist/cli/commands/clear.d.ts +9 -0
- package/dist/cli/commands/clear.d.ts.map +1 -0
- package/dist/cli/commands/clear.js +116 -0
- package/dist/cli/commands/clear.js.map +1 -0
- package/dist/cli/commands/index.d.ts +8 -0
- package/dist/cli/commands/index.d.ts.map +1 -0
- package/dist/cli/commands/index.js +118 -0
- package/dist/cli/commands/index.js.map +1 -0
- package/dist/cli/commands/info.d.ts +8 -0
- package/dist/cli/commands/info.d.ts.map +1 -0
- package/dist/cli/commands/info.js +96 -0
- package/dist/cli/commands/info.js.map +1 -0
- package/dist/cli/commands/search.d.ts +9 -0
- package/dist/cli/commands/search.d.ts.map +1 -0
- package/dist/cli/commands/search.js +178 -0
- package/dist/cli/commands/search.js.map +1 -0
- package/dist/cli/commands/watch.d.ts +8 -0
- package/dist/cli/commands/watch.d.ts.map +1 -0
- package/dist/cli/commands/watch.js +141 -0
- package/dist/cli/commands/watch.js.map +1 -0
- package/dist/cli/main.d.ts +6 -0
- package/dist/cli/main.d.ts.map +1 -0
- package/dist/cli/main.js +57 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/output/colorizer.d.ts +36 -0
- package/dist/cli/output/colorizer.d.ts.map +1 -0
- package/dist/cli/output/colorizer.js +101 -0
- package/dist/cli/output/colorizer.js.map +1 -0
- package/dist/cli/output/formatter.d.ts +31 -0
- package/dist/cli/output/formatter.d.ts.map +1 -0
- package/dist/cli/output/formatter.js +146 -0
- package/dist/cli/output/formatter.js.map +1 -0
- package/dist/cli/output/table.d.ts +12 -0
- package/dist/cli/output/table.d.ts.map +1 -0
- package/dist/cli/output/table.js +48 -0
- package/dist/cli/output/table.js.map +1 -0
- package/dist/core/indexer/ChunkProcessor.d.ts +21 -0
- package/dist/core/indexer/ChunkProcessor.d.ts.map +1 -0
- package/dist/core/indexer/ChunkProcessor.js +105 -0
- package/dist/core/indexer/ChunkProcessor.js.map +1 -0
- package/dist/core/indexer/IndexBuilder.d.ts +47 -0
- package/dist/core/indexer/IndexBuilder.d.ts.map +1 -0
- package/dist/core/indexer/IndexBuilder.js +274 -0
- package/dist/core/indexer/IndexBuilder.js.map +1 -0
- package/dist/core/indexer/IndexSerializer.d.ts +30 -0
- package/dist/core/indexer/IndexSerializer.d.ts.map +1 -0
- package/dist/core/indexer/IndexSerializer.js +142 -0
- package/dist/core/indexer/IndexSerializer.js.map +1 -0
- package/dist/core/indexer/OffsetMapper.d.ts +55 -0
- package/dist/core/indexer/OffsetMapper.d.ts.map +1 -0
- package/dist/core/indexer/OffsetMapper.js +94 -0
- package/dist/core/indexer/OffsetMapper.js.map +1 -0
- package/dist/core/indexer/TokenExtractor.d.ts +27 -0
- package/dist/core/indexer/TokenExtractor.d.ts.map +1 -0
- package/dist/core/indexer/TokenExtractor.js +92 -0
- package/dist/core/indexer/TokenExtractor.js.map +1 -0
- package/dist/core/searcher/IndexSearcher.d.ts +37 -0
- package/dist/core/searcher/IndexSearcher.d.ts.map +1 -0
- package/dist/core/searcher/IndexSearcher.js +360 -0
- package/dist/core/searcher/IndexSearcher.js.map +1 -0
- package/dist/core/searcher/RankEngine.d.ts +29 -0
- package/dist/core/searcher/RankEngine.d.ts.map +1 -0
- package/dist/core/searcher/RankEngine.js +90 -0
- package/dist/core/searcher/RankEngine.js.map +1 -0
- package/dist/core/searcher/ResultFetcher.d.ts +37 -0
- package/dist/core/searcher/ResultFetcher.d.ts.map +1 -0
- package/dist/core/searcher/ResultFetcher.js +118 -0
- package/dist/core/searcher/ResultFetcher.js.map +1 -0
- package/dist/core/streaming/ChunkSplitter.d.ts +25 -0
- package/dist/core/streaming/ChunkSplitter.d.ts.map +1 -0
- package/dist/core/streaming/ChunkSplitter.js +71 -0
- package/dist/core/streaming/ChunkSplitter.js.map +1 -0
- package/dist/core/streaming/FileStreamer.d.ts +39 -0
- package/dist/core/streaming/FileStreamer.d.ts.map +1 -0
- package/dist/core/streaming/FileStreamer.js +138 -0
- package/dist/core/streaming/FileStreamer.js.map +1 -0
- package/dist/core/streaming/LineBuffer.d.ts +26 -0
- package/dist/core/streaming/LineBuffer.d.ts.map +1 -0
- package/dist/core/streaming/LineBuffer.js +52 -0
- package/dist/core/streaming/LineBuffer.js.map +1 -0
- package/dist/core/workers/IndexWorker.d.ts +8 -0
- package/dist/core/workers/IndexWorker.d.ts.map +1 -0
- package/dist/core/workers/IndexWorker.js +41 -0
- package/dist/core/workers/IndexWorker.js.map +1 -0
- package/dist/core/workers/SearchWorker.d.ts +7 -0
- package/dist/core/workers/SearchWorker.d.ts.map +1 -0
- package/dist/core/workers/SearchWorker.js +63 -0
- package/dist/core/workers/SearchWorker.js.map +1 -0
- package/dist/core/workers/WorkerPool.d.ts +30 -0
- package/dist/core/workers/WorkerPool.d.ts.map +1 -0
- package/dist/core/workers/WorkerPool.js +132 -0
- package/dist/core/workers/WorkerPool.js.map +1 -0
- package/dist/formats/LogFormatDetector.d.ts +22 -0
- package/dist/formats/LogFormatDetector.d.ts.map +1 -0
- package/dist/formats/LogFormatDetector.js +123 -0
- package/dist/formats/LogFormatDetector.js.map +1 -0
- package/dist/formats/parsers/ApacheParser.d.ts +10 -0
- package/dist/formats/parsers/ApacheParser.d.ts.map +1 -0
- package/dist/formats/parsers/ApacheParser.js +54 -0
- package/dist/formats/parsers/ApacheParser.js.map +1 -0
- package/dist/formats/parsers/GenericParser.d.ts +11 -0
- package/dist/formats/parsers/GenericParser.d.ts.map +1 -0
- package/dist/formats/parsers/GenericParser.js +61 -0
- package/dist/formats/parsers/GenericParser.js.map +1 -0
- package/dist/formats/parsers/JsonParser.d.ts +12 -0
- package/dist/formats/parsers/JsonParser.d.ts.map +1 -0
- package/dist/formats/parsers/JsonParser.js +92 -0
- package/dist/formats/parsers/JsonParser.js.map +1 -0
- package/dist/formats/parsers/NginxParser.d.ts +15 -0
- package/dist/formats/parsers/NginxParser.d.ts.map +1 -0
- package/dist/formats/parsers/NginxParser.js +78 -0
- package/dist/formats/parsers/NginxParser.js.map +1 -0
- package/dist/formats/parsers/SyslogParser.d.ts +10 -0
- package/dist/formats/parsers/SyslogParser.d.ts.map +1 -0
- package/dist/formats/parsers/SyslogParser.js +73 -0
- package/dist/formats/parsers/SyslogParser.js.map +1 -0
- package/dist/formats/schemas/LogSchema.d.ts +70 -0
- package/dist/formats/schemas/LogSchema.d.ts.map +1 -0
- package/dist/formats/schemas/LogSchema.js +7 -0
- package/dist/formats/schemas/LogSchema.js.map +1 -0
- package/dist/index-store/CacheManager.d.ts +45 -0
- package/dist/index-store/CacheManager.d.ts.map +1 -0
- package/dist/index-store/CacheManager.js +84 -0
- package/dist/index-store/CacheManager.js.map +1 -0
- package/dist/index-store/FileWatcher.d.ts +39 -0
- package/dist/index-store/FileWatcher.d.ts.map +1 -0
- package/dist/index-store/FileWatcher.js +121 -0
- package/dist/index-store/FileWatcher.js.map +1 -0
- package/dist/index-store/IncrementalUpdater.d.ts +19 -0
- package/dist/index-store/IncrementalUpdater.d.ts.map +1 -0
- package/dist/index-store/IncrementalUpdater.js +62 -0
- package/dist/index-store/IncrementalUpdater.js.map +1 -0
- package/dist/index-store/IndexStore.d.ts +66 -0
- package/dist/index-store/IndexStore.d.ts.map +1 -0
- package/dist/index-store/IndexStore.js +183 -0
- package/dist/index-store/IndexStore.js.map +1 -0
- package/dist/index.d.ts +47 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +99 -0
- package/dist/index.js.map +1 -0
- package/dist/pro/alerts/AlertEngine.d.ts +35 -0
- package/dist/pro/alerts/AlertEngine.d.ts.map +1 -0
- package/dist/pro/alerts/AlertEngine.js +162 -0
- package/dist/pro/alerts/AlertEngine.js.map +1 -0
- package/dist/pro/alerts/Notifier.d.ts +23 -0
- package/dist/pro/alerts/Notifier.d.ts.map +1 -0
- package/dist/pro/alerts/Notifier.js +173 -0
- package/dist/pro/alerts/Notifier.js.map +1 -0
- package/dist/pro/alerts/RuleParser.d.ts +32 -0
- package/dist/pro/alerts/RuleParser.d.ts.map +1 -0
- package/dist/pro/alerts/RuleParser.js +86 -0
- package/dist/pro/alerts/RuleParser.js.map +1 -0
- package/dist/pro/auth/LicenseValidator.d.ts +29 -0
- package/dist/pro/auth/LicenseValidator.d.ts.map +1 -0
- package/dist/pro/auth/LicenseValidator.js +122 -0
- package/dist/pro/auth/LicenseValidator.js.map +1 -0
- package/dist/pro/auth/TokenManager.d.ts +27 -0
- package/dist/pro/auth/TokenManager.d.ts.map +1 -0
- package/dist/pro/auth/TokenManager.js +98 -0
- package/dist/pro/auth/TokenManager.js.map +1 -0
- package/dist/pro/webui/UIServer.d.ts +34 -0
- package/dist/pro/webui/UIServer.d.ts.map +1 -0
- package/dist/pro/webui/UIServer.js +353 -0
- package/dist/pro/webui/UIServer.js.map +1 -0
- package/dist/query/QueryEngine.d.ts +34 -0
- package/dist/query/QueryEngine.d.ts.map +1 -0
- package/dist/query/QueryEngine.js +187 -0
- package/dist/query/QueryEngine.js.map +1 -0
- package/dist/query/operators/AndOperator.d.ts +18 -0
- package/dist/query/operators/AndOperator.d.ts.map +1 -0
- package/dist/query/operators/AndOperator.js +55 -0
- package/dist/query/operators/AndOperator.js.map +1 -0
- package/dist/query/operators/NotOperator.d.ts +19 -0
- package/dist/query/operators/NotOperator.d.ts.map +1 -0
- package/dist/query/operators/NotOperator.js +43 -0
- package/dist/query/operators/NotOperator.js.map +1 -0
- package/dist/query/operators/OrOperator.d.ts +17 -0
- package/dist/query/operators/OrOperator.d.ts.map +1 -0
- package/dist/query/operators/OrOperator.js +54 -0
- package/dist/query/operators/OrOperator.js.map +1 -0
- package/dist/query/operators/RangeOperator.d.ts +23 -0
- package/dist/query/operators/RangeOperator.d.ts.map +1 -0
- package/dist/query/operators/RangeOperator.js +63 -0
- package/dist/query/operators/RangeOperator.js.map +1 -0
- package/dist/query/regex/FuzzyMatcher.d.ts +29 -0
- package/dist/query/regex/FuzzyMatcher.d.ts.map +1 -0
- package/dist/query/regex/FuzzyMatcher.js +89 -0
- package/dist/query/regex/FuzzyMatcher.js.map +1 -0
- package/dist/query/regex/RegexMatcher.d.ts +31 -0
- package/dist/query/regex/RegexMatcher.d.ts.map +1 -0
- package/dist/query/regex/RegexMatcher.js +73 -0
- package/dist/query/regex/RegexMatcher.js.map +1 -0
- package/dist/types/ConfigTypes.d.ts +78 -0
- package/dist/types/ConfigTypes.d.ts.map +1 -0
- package/dist/types/ConfigTypes.js +7 -0
- package/dist/types/ConfigTypes.js.map +1 -0
- package/dist/types/IndexTypes.d.ts +86 -0
- package/dist/types/IndexTypes.d.ts.map +1 -0
- package/dist/types/IndexTypes.js +7 -0
- package/dist/types/IndexTypes.js.map +1 -0
- package/dist/types/SearchTypes.d.ts +102 -0
- package/dist/types/SearchTypes.d.ts.map +1 -0
- package/dist/types/SearchTypes.js +7 -0
- package/dist/types/SearchTypes.js.map +1 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +24 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/fs-helpers.d.ts +9 -0
- package/dist/utils/fs-helpers.d.ts.map +1 -0
- package/dist/utils/fs-helpers.js +76 -0
- package/dist/utils/fs-helpers.js.map +1 -0
- package/dist/utils/hash.d.ts +7 -0
- package/dist/utils/hash.d.ts.map +1 -0
- package/dist/utils/hash.js +49 -0
- package/dist/utils/hash.js.map +1 -0
- package/dist/utils/logger.d.ts +19 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +41 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/performance.d.ts +14 -0
- package/dist/utils/performance.d.ts.map +1 -0
- package/dist/utils/performance.js +32 -0
- package/dist/utils/performance.js.map +1 -0
- package/dist/utils/progress.d.ts +7 -0
- package/dist/utils/progress.d.ts.map +1 -0
- package/dist/utils/progress.js +22 -0
- package/dist/utils/progress.js.map +1 -0
- package/package.json +105 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QueryEngine.ts
|
|
3
|
+
* Full-featured query parser that converts query strings into ParsedQuery trees.
|
|
4
|
+
*
|
|
5
|
+
* Supported syntax:
|
|
6
|
+
* Simple: "error"
|
|
7
|
+
* Phrase: "\"connection refused\""
|
|
8
|
+
* AND: "error AND timeout"
|
|
9
|
+
* OR: "error OR warning"
|
|
10
|
+
* NOT: "error NOT 404"
|
|
11
|
+
* Regex: "/error [45]\d{2}/" or --regex flag
|
|
12
|
+
* Fuzzy: "~eror" (threshold default 0.85)
|
|
13
|
+
* Level: "level:ERROR"
|
|
14
|
+
* Field: "status:500"
|
|
15
|
+
*/
|
|
16
|
+
import type { ParsedQuery } from '../types/SearchTypes';
|
|
17
|
+
export interface ParseOptions {
|
|
18
|
+
ignoreCase?: boolean;
|
|
19
|
+
isRegex?: boolean;
|
|
20
|
+
}
|
|
21
|
+
export declare class QueryParser {
|
|
22
|
+
/**
|
|
23
|
+
* Parse a query string into a ParsedQuery tree.
|
|
24
|
+
*/
|
|
25
|
+
parse(query: string, options?: ParseOptions): ParsedQuery;
|
|
26
|
+
private parseExpression;
|
|
27
|
+
private parseAtom;
|
|
28
|
+
/**
|
|
29
|
+
* Split a string by `separator` at the top level (not inside quotes or parens).
|
|
30
|
+
*/
|
|
31
|
+
private splitTopLevel;
|
|
32
|
+
private buildRegex;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=QueryEngine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QueryEngine.d.ts","sourceRoot":"","sources":["../../src/query/QueryEngine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EACV,WAAW,EAUZ,MAAM,sBAAsB,CAAC;AAE9B,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,qBAAa,WAAW;IACtB;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,WAAW;IA6B7D,OAAO,CAAC,eAAe;IA0CvB,OAAO,CAAC,SAAS;IA8DjB;;OAEG;IACH,OAAO,CAAC,aAAa;IAqCrB,OAAO,CAAC,UAAU;CAWnB"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* QueryEngine.ts
|
|
4
|
+
* Full-featured query parser that converts query strings into ParsedQuery trees.
|
|
5
|
+
*
|
|
6
|
+
* Supported syntax:
|
|
7
|
+
* Simple: "error"
|
|
8
|
+
* Phrase: "\"connection refused\""
|
|
9
|
+
* AND: "error AND timeout"
|
|
10
|
+
* OR: "error OR warning"
|
|
11
|
+
* NOT: "error NOT 404"
|
|
12
|
+
* Regex: "/error [45]\d{2}/" or --regex flag
|
|
13
|
+
* Fuzzy: "~eror" (threshold default 0.85)
|
|
14
|
+
* Level: "level:ERROR"
|
|
15
|
+
* Field: "status:500"
|
|
16
|
+
*/
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.QueryParser = void 0;
|
|
19
|
+
class QueryParser {
|
|
20
|
+
/**
|
|
21
|
+
* Parse a query string into a ParsedQuery tree.
|
|
22
|
+
*/
|
|
23
|
+
parse(query, options = {}) {
|
|
24
|
+
const raw = query.trim();
|
|
25
|
+
// ── Explicit regex flag ─────────────────────────────────────────────────
|
|
26
|
+
if (options.isRegex) {
|
|
27
|
+
return this.buildRegex(raw, options.ignoreCase ?? true);
|
|
28
|
+
}
|
|
29
|
+
// ── Regex literal: /pattern/flags ───────────────────────────────────────
|
|
30
|
+
const regexLiteral = raw.match(/^\/(.+)\/([gimsuy]*)$/);
|
|
31
|
+
if (regexLiteral) {
|
|
32
|
+
try {
|
|
33
|
+
const flags = (options.ignoreCase ? 'i' : '') + regexLiteral[2].replace(/i/g, '');
|
|
34
|
+
return {
|
|
35
|
+
type: 'regex',
|
|
36
|
+
raw,
|
|
37
|
+
pattern: new RegExp(regexLiteral[1], flags),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
// Fall through to simple parse
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// ── Tokenize ─────────────────────────────────────────────────────────────
|
|
45
|
+
return this.parseExpression(raw);
|
|
46
|
+
}
|
|
47
|
+
// ─── Recursive Descent Parser ─────────────────────────────────────────────
|
|
48
|
+
parseExpression(input) {
|
|
49
|
+
const raw = input.trim();
|
|
50
|
+
// Split on top-level AND / OR (not inside quotes)
|
|
51
|
+
const orParts = this.splitTopLevel(raw, ' OR ');
|
|
52
|
+
if (orParts.length > 1) {
|
|
53
|
+
return {
|
|
54
|
+
type: 'or',
|
|
55
|
+
raw,
|
|
56
|
+
operands: orParts.map((p) => this.parseExpression(p)),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
const andParts = this.splitTopLevel(raw, ' AND ');
|
|
60
|
+
if (andParts.length > 1) {
|
|
61
|
+
return {
|
|
62
|
+
type: 'and',
|
|
63
|
+
raw,
|
|
64
|
+
operands: andParts.map((p) => this.parseExpression(p)),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
// Split on top-level NOT
|
|
68
|
+
const notParts = this.splitTopLevel(raw, ' NOT ');
|
|
69
|
+
if (notParts.length === 2) {
|
|
70
|
+
return {
|
|
71
|
+
type: 'and',
|
|
72
|
+
raw,
|
|
73
|
+
operands: [
|
|
74
|
+
this.parseExpression(notParts[0]),
|
|
75
|
+
{
|
|
76
|
+
type: 'not',
|
|
77
|
+
raw: notParts[1],
|
|
78
|
+
operand: this.parseExpression(notParts[1]),
|
|
79
|
+
},
|
|
80
|
+
],
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
return this.parseAtom(raw);
|
|
84
|
+
}
|
|
85
|
+
parseAtom(raw) {
|
|
86
|
+
const trimmed = raw.trim();
|
|
87
|
+
// Phrase query: "exact phrase"
|
|
88
|
+
if (trimmed.startsWith('"') && trimmed.endsWith('"') && trimmed.length > 2) {
|
|
89
|
+
const phrase = trimmed.slice(1, -1);
|
|
90
|
+
const terms = phrase.split(/\s+/).filter(Boolean);
|
|
91
|
+
if (terms.length === 1) {
|
|
92
|
+
return { type: 'simple', raw, term: terms[0].toLowerCase() };
|
|
93
|
+
}
|
|
94
|
+
return {
|
|
95
|
+
type: 'phrase',
|
|
96
|
+
raw,
|
|
97
|
+
phrase,
|
|
98
|
+
terms: terms.map((t) => t.toLowerCase()),
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
// Fuzzy: ~term
|
|
102
|
+
if (trimmed.startsWith('~') && trimmed.length > 1) {
|
|
103
|
+
const fuzzyPart = trimmed.slice(1);
|
|
104
|
+
const colonIdx = fuzzyPart.lastIndexOf(':');
|
|
105
|
+
let term = fuzzyPart;
|
|
106
|
+
let threshold = 0.85;
|
|
107
|
+
if (colonIdx !== -1) {
|
|
108
|
+
const t = parseFloat(fuzzyPart.slice(colonIdx + 1));
|
|
109
|
+
if (!isNaN(t) && t >= 0 && t <= 1) {
|
|
110
|
+
term = fuzzyPart.slice(0, colonIdx);
|
|
111
|
+
threshold = t;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return { type: 'fuzzy', raw, term: term.toLowerCase(), threshold };
|
|
115
|
+
}
|
|
116
|
+
// Field query: field:value (e.g., level:ERROR, status:500)
|
|
117
|
+
const colonIdx = trimmed.indexOf(':');
|
|
118
|
+
if (colonIdx > 0 && colonIdx < trimmed.length - 1) {
|
|
119
|
+
const field = trimmed.slice(0, colonIdx).toLowerCase().trim();
|
|
120
|
+
const value = trimmed.slice(colonIdx + 1).trim().replace(/^"|"$/g, '');
|
|
121
|
+
if (field === 'level' || field === 'severity') {
|
|
122
|
+
return {
|
|
123
|
+
type: 'level',
|
|
124
|
+
raw,
|
|
125
|
+
level: value.toUpperCase(),
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
return { type: 'field', raw, field, value };
|
|
129
|
+
}
|
|
130
|
+
// Parenthesized expression
|
|
131
|
+
if (trimmed.startsWith('(') && trimmed.endsWith(')')) {
|
|
132
|
+
return this.parseExpression(trimmed.slice(1, -1));
|
|
133
|
+
}
|
|
134
|
+
// Simple term
|
|
135
|
+
return { type: 'simple', raw, term: trimmed.toLowerCase() };
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Split a string by `separator` at the top level (not inside quotes or parens).
|
|
139
|
+
*/
|
|
140
|
+
splitTopLevel(input, separator) {
|
|
141
|
+
const parts = [];
|
|
142
|
+
let depth = 0;
|
|
143
|
+
let inQuote = false;
|
|
144
|
+
let current = '';
|
|
145
|
+
let i = 0;
|
|
146
|
+
while (i < input.length) {
|
|
147
|
+
const char = input[i];
|
|
148
|
+
if (char === '"') {
|
|
149
|
+
inQuote = !inQuote;
|
|
150
|
+
current += char;
|
|
151
|
+
i++;
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
if (!inQuote) {
|
|
155
|
+
if (char === '(')
|
|
156
|
+
depth++;
|
|
157
|
+
if (char === ')')
|
|
158
|
+
depth--;
|
|
159
|
+
if (depth === 0 && input.slice(i).startsWith(separator)) {
|
|
160
|
+
parts.push(current.trim());
|
|
161
|
+
current = '';
|
|
162
|
+
i += separator.length;
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
current += char;
|
|
167
|
+
i++;
|
|
168
|
+
}
|
|
169
|
+
if (current.trim())
|
|
170
|
+
parts.push(current.trim());
|
|
171
|
+
return parts;
|
|
172
|
+
}
|
|
173
|
+
buildRegex(pattern, ignoreCase) {
|
|
174
|
+
const flags = ignoreCase ? 'gi' : 'g';
|
|
175
|
+
let regex;
|
|
176
|
+
try {
|
|
177
|
+
regex = new RegExp(pattern, flags);
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
// Escape and retry as literal
|
|
181
|
+
regex = new RegExp(pattern.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), flags);
|
|
182
|
+
}
|
|
183
|
+
return { type: 'regex', raw: pattern, pattern: regex };
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
exports.QueryParser = QueryParser;
|
|
187
|
+
//# sourceMappingURL=QueryEngine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QueryEngine.js","sourceRoot":"","sources":["../../src/query/QueryEngine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AndOperator.ts
|
|
3
|
+
* Returns only lines that match ALL sub-queries.
|
|
4
|
+
* Performs sorted-merge intersection for optimal performance.
|
|
5
|
+
*/
|
|
6
|
+
export declare class AndOperator {
|
|
7
|
+
/**
|
|
8
|
+
* Intersect multiple offset arrays.
|
|
9
|
+
* All arrays must be sorted ascending.
|
|
10
|
+
* Uses a merge-pointer approach — O(n) where n = sum of all list lengths.
|
|
11
|
+
*/
|
|
12
|
+
static intersect(lists: number[][]): number[];
|
|
13
|
+
/**
|
|
14
|
+
* Two-pointer intersection of two sorted arrays. O(n + m).
|
|
15
|
+
*/
|
|
16
|
+
private static intersectTwo;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=AndOperator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AndOperator.d.ts","sourceRoot":"","sources":["../../../src/query/operators/AndOperator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,qBAAa,WAAW;IACtB;;;;OAIG;IACH,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE;IAiB7C;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,YAAY;CAmB5B"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* AndOperator.ts
|
|
4
|
+
* Returns only lines that match ALL sub-queries.
|
|
5
|
+
* Performs sorted-merge intersection for optimal performance.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.AndOperator = void 0;
|
|
9
|
+
class AndOperator {
|
|
10
|
+
/**
|
|
11
|
+
* Intersect multiple offset arrays.
|
|
12
|
+
* All arrays must be sorted ascending.
|
|
13
|
+
* Uses a merge-pointer approach — O(n) where n = sum of all list lengths.
|
|
14
|
+
*/
|
|
15
|
+
static intersect(lists) {
|
|
16
|
+
if (lists.length === 0)
|
|
17
|
+
return [];
|
|
18
|
+
if (lists.length === 1)
|
|
19
|
+
return lists[0];
|
|
20
|
+
// Sort by list length ascending (smallest first = fewest iterations)
|
|
21
|
+
const sorted = [...lists].sort((a, b) => a.length - b.length);
|
|
22
|
+
// Start with the smallest and progressively intersect
|
|
23
|
+
let result = sorted[0];
|
|
24
|
+
for (let i = 1; i < sorted.length; i++) {
|
|
25
|
+
result = this.intersectTwo(result, sorted[i]);
|
|
26
|
+
if (result.length === 0)
|
|
27
|
+
return []; // Short-circuit
|
|
28
|
+
}
|
|
29
|
+
return result;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Two-pointer intersection of two sorted arrays. O(n + m).
|
|
33
|
+
*/
|
|
34
|
+
static intersectTwo(a, b) {
|
|
35
|
+
const result = [];
|
|
36
|
+
let i = 0;
|
|
37
|
+
let j = 0;
|
|
38
|
+
while (i < a.length && j < b.length) {
|
|
39
|
+
if (a[i] === b[j]) {
|
|
40
|
+
result.push(a[i]);
|
|
41
|
+
i++;
|
|
42
|
+
j++;
|
|
43
|
+
}
|
|
44
|
+
else if (a[i] < b[j]) {
|
|
45
|
+
i++;
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
j++;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return result;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
exports.AndOperator = AndOperator;
|
|
55
|
+
//# sourceMappingURL=AndOperator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AndOperator.js","sourceRoot":"","sources":["../../../src/query/operators/AndOperator.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,MAAa,WAAW;IACtB;;;;OAIG;IACH,MAAM,CAAC,SAAS,CAAC,KAAiB;QAChC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAClC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;QAExC,qEAAqE;QACrE,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;QAE9D,sDAAsD;QACtD,IAAI,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAC,CAAC,gBAAgB;QACtD,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,YAAY,CAAC,CAAW,EAAE,CAAW;QAClD,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,IAAI,CAAC,GAAG,CAAC,CAAC;QAEV,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;YACpC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC,EAAE,CAAC;gBACJ,CAAC,EAAE,CAAC;YACN,CAAC;iBAAM,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvB,CAAC,EAAE,CAAC;YACN,CAAC;iBAAM,CAAC;gBACN,CAAC,EAAE,CAAC;YACN,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AA7CD,kCA6CC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NotOperator.ts
|
|
3
|
+
* Returns lines from `all` that are NOT in `excluded`.
|
|
4
|
+
* Uses a sorted set-difference approach.
|
|
5
|
+
*/
|
|
6
|
+
export declare class NotOperator {
|
|
7
|
+
/**
|
|
8
|
+
* Set-difference: all offsets in `universe` that are NOT in `excluded`.
|
|
9
|
+
* Both arrays must be sorted ascending.
|
|
10
|
+
* O(n + m) time, O(n) space.
|
|
11
|
+
*/
|
|
12
|
+
static subtract(universe: number[], excluded: number[]): number[];
|
|
13
|
+
/**
|
|
14
|
+
* Faster version when both arrays are sorted: two-pointer approach.
|
|
15
|
+
* O(n + m) time, O(1) extra space (beyond output).
|
|
16
|
+
*/
|
|
17
|
+
static subtractSorted(universe: number[], excluded: number[]): number[];
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=NotOperator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NotOperator.d.ts","sourceRoot":"","sources":["../../../src/query/operators/NotOperator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,qBAAa,WAAW;IACtB;;;;OAIG;IACH,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;IAQjE;;;OAGG;IACH,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;CAgBxE"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* NotOperator.ts
|
|
4
|
+
* Returns lines from `all` that are NOT in `excluded`.
|
|
5
|
+
* Uses a sorted set-difference approach.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.NotOperator = void 0;
|
|
9
|
+
class NotOperator {
|
|
10
|
+
/**
|
|
11
|
+
* Set-difference: all offsets in `universe` that are NOT in `excluded`.
|
|
12
|
+
* Both arrays must be sorted ascending.
|
|
13
|
+
* O(n + m) time, O(n) space.
|
|
14
|
+
*/
|
|
15
|
+
static subtract(universe, excluded) {
|
|
16
|
+
if (excluded.length === 0)
|
|
17
|
+
return [...universe];
|
|
18
|
+
if (universe.length === 0)
|
|
19
|
+
return [];
|
|
20
|
+
const excludedSet = new Set(excluded);
|
|
21
|
+
return universe.filter((o) => !excludedSet.has(o));
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Faster version when both arrays are sorted: two-pointer approach.
|
|
25
|
+
* O(n + m) time, O(1) extra space (beyond output).
|
|
26
|
+
*/
|
|
27
|
+
static subtractSorted(universe, excluded) {
|
|
28
|
+
const result = [];
|
|
29
|
+
let i = 0;
|
|
30
|
+
let j = 0;
|
|
31
|
+
while (i < universe.length) {
|
|
32
|
+
while (j < excluded.length && excluded[j] < universe[i])
|
|
33
|
+
j++;
|
|
34
|
+
if (j >= excluded.length || excluded[j] !== universe[i]) {
|
|
35
|
+
result.push(universe[i]);
|
|
36
|
+
}
|
|
37
|
+
i++;
|
|
38
|
+
}
|
|
39
|
+
return result;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
exports.NotOperator = NotOperator;
|
|
43
|
+
//# sourceMappingURL=NotOperator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NotOperator.js","sourceRoot":"","sources":["../../../src/query/operators/NotOperator.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,MAAa,WAAW;IACtB;;;;OAIG;IACH,MAAM,CAAC,QAAQ,CAAC,QAAkB,EAAE,QAAkB;QACpD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC;QAChD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAErC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtC,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,cAAc,CAAC,QAAkB,EAAE,QAAkB;QAC1D,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,IAAI,CAAC,GAAG,CAAC,CAAC;QAEV,OAAO,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;gBAAE,CAAC,EAAE,CAAC;YAE7D,IAAI,CAAC,IAAI,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxD,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3B,CAAC;YACD,CAAC,EAAE,CAAC;QACN,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAlCD,kCAkCC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OrOperator.ts
|
|
3
|
+
* Returns lines that match ANY of the sub-queries.
|
|
4
|
+
* Performs a sorted merge union.
|
|
5
|
+
*/
|
|
6
|
+
export declare class OrOperator {
|
|
7
|
+
/**
|
|
8
|
+
* Union multiple sorted offset arrays into a single sorted, deduplicated array.
|
|
9
|
+
* Uses a k-way merge — O(n log k) where n = total elements.
|
|
10
|
+
*/
|
|
11
|
+
static union(lists: number[][]): number[];
|
|
12
|
+
/**
|
|
13
|
+
* Merge two sorted arrays into a sorted, deduplicated array. O(n + m).
|
|
14
|
+
*/
|
|
15
|
+
static mergeTwo(a: number[], b: number[]): number[];
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=OrOperator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OrOperator.d.ts","sourceRoot":"","sources":["../../../src/query/operators/OrOperator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,qBAAa,UAAU;IACrB;;;OAGG;IACH,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE;IAYzC;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;CAsBpD"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* OrOperator.ts
|
|
4
|
+
* Returns lines that match ANY of the sub-queries.
|
|
5
|
+
* Performs a sorted merge union.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.OrOperator = void 0;
|
|
9
|
+
class OrOperator {
|
|
10
|
+
/**
|
|
11
|
+
* Union multiple sorted offset arrays into a single sorted, deduplicated array.
|
|
12
|
+
* Uses a k-way merge — O(n log k) where n = total elements.
|
|
13
|
+
*/
|
|
14
|
+
static union(lists) {
|
|
15
|
+
if (lists.length === 0)
|
|
16
|
+
return [];
|
|
17
|
+
if (lists.length === 1)
|
|
18
|
+
return [...lists[0]];
|
|
19
|
+
const result = new Set();
|
|
20
|
+
for (const list of lists) {
|
|
21
|
+
for (const offset of list)
|
|
22
|
+
result.add(offset);
|
|
23
|
+
}
|
|
24
|
+
return [...result].sort((a, b) => a - b);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Merge two sorted arrays into a sorted, deduplicated array. O(n + m).
|
|
28
|
+
*/
|
|
29
|
+
static mergeTwo(a, b) {
|
|
30
|
+
const result = [];
|
|
31
|
+
let i = 0;
|
|
32
|
+
let j = 0;
|
|
33
|
+
while (i < a.length && j < b.length) {
|
|
34
|
+
if (a[i] === b[j]) {
|
|
35
|
+
result.push(a[i]);
|
|
36
|
+
i++;
|
|
37
|
+
j++;
|
|
38
|
+
}
|
|
39
|
+
else if (a[i] < b[j]) {
|
|
40
|
+
result.push(a[i++]);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
result.push(b[j++]);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
while (i < a.length)
|
|
47
|
+
result.push(a[i++]);
|
|
48
|
+
while (j < b.length)
|
|
49
|
+
result.push(b[j++]);
|
|
50
|
+
return result;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
exports.OrOperator = OrOperator;
|
|
54
|
+
//# sourceMappingURL=OrOperator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OrOperator.js","sourceRoot":"","sources":["../../../src/query/operators/OrOperator.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,MAAa,UAAU;IACrB;;;OAGG;IACH,MAAM,CAAC,KAAK,CAAC,KAAiB;QAC5B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAClC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAE7C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;QACjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,KAAK,MAAM,MAAM,IAAI,IAAI;gBAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAChD,CAAC;QAED,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,CAAW,EAAE,CAAW;QACtC,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,IAAI,CAAC,GAAG,CAAC,CAAC;QAEV,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;YACpC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC,EAAE,CAAC;gBACJ,CAAC,EAAE,CAAC;YACN,CAAC;iBAAM,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACtB,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM;YAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM;YAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAEzC,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AA1CD,gCA0CC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RangeOperator.ts
|
|
3
|
+
* Filters a list of line contents by a value range (timestamps, HTTP status codes, etc.).
|
|
4
|
+
*/
|
|
5
|
+
export interface RangeFilter {
|
|
6
|
+
field: 'timestamp' | 'status' | 'size' | 'custom';
|
|
7
|
+
from?: string | number;
|
|
8
|
+
to?: string | number;
|
|
9
|
+
}
|
|
10
|
+
export declare class RangeOperator {
|
|
11
|
+
/**
|
|
12
|
+
* Filter lines to those where the extracted field value falls within [from, to].
|
|
13
|
+
* Returns the indices (into `lines`) that pass the filter.
|
|
14
|
+
*/
|
|
15
|
+
static filterLines(lines: string[], offsets: number[], filter: RangeFilter): number[];
|
|
16
|
+
/**
|
|
17
|
+
* Filter by timestamp range (ISO date strings).
|
|
18
|
+
*/
|
|
19
|
+
static filterByTimestamp(offsets: number[], lines: string[], since?: string, until?: string): number[];
|
|
20
|
+
private static extractField;
|
|
21
|
+
private static inRange;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=RangeOperator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RangeOperator.d.ts","sourceRoot":"","sources":["../../../src/query/operators/RangeOperator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,WAAW,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;IAClD,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACtB;AAED,qBAAa,aAAa;IACxB;;;OAGG;IACH,MAAM,CAAC,WAAW,CAChB,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,EAAE,MAAM,EAAE,EACjB,MAAM,EAAE,WAAW,GAClB,MAAM,EAAE;IAaX;;OAEG;IACH,MAAM,CAAC,iBAAiB,CACtB,OAAO,EAAE,MAAM,EAAE,EACjB,KAAK,EAAE,MAAM,EAAE,EACf,KAAK,CAAC,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,MAAM,GACb,MAAM,EAAE;IAcX,OAAO,CAAC,MAAM,CAAC,YAAY;IAmB3B,OAAO,CAAC,MAAM,CAAC,OAAO;CASvB"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* RangeOperator.ts
|
|
4
|
+
* Filters a list of line contents by a value range (timestamps, HTTP status codes, etc.).
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.RangeOperator = void 0;
|
|
8
|
+
class RangeOperator {
|
|
9
|
+
/**
|
|
10
|
+
* Filter lines to those where the extracted field value falls within [from, to].
|
|
11
|
+
* Returns the indices (into `lines`) that pass the filter.
|
|
12
|
+
*/
|
|
13
|
+
static filterLines(lines, offsets, filter) {
|
|
14
|
+
const result = [];
|
|
15
|
+
for (let i = 0; i < lines.length; i++) {
|
|
16
|
+
const value = this.extractField(lines[i], filter.field);
|
|
17
|
+
if (value !== null && this.inRange(value, filter.from, filter.to)) {
|
|
18
|
+
result.push(offsets[i]);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return result;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Filter by timestamp range (ISO date strings).
|
|
25
|
+
*/
|
|
26
|
+
static filterByTimestamp(offsets, lines, since, until) {
|
|
27
|
+
const sinceMs = since ? new Date(since).getTime() : 0;
|
|
28
|
+
const untilMs = until ? new Date(until).getTime() : Infinity;
|
|
29
|
+
const ISO_TS = /\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}:\d{2}/;
|
|
30
|
+
return offsets.filter((_, i) => {
|
|
31
|
+
const match = lines[i].match(ISO_TS);
|
|
32
|
+
if (!match)
|
|
33
|
+
return true; // include if no timestamp found
|
|
34
|
+
const ts = new Date(match[0]).getTime();
|
|
35
|
+
return ts >= sinceMs && ts <= untilMs;
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
static extractField(line, field) {
|
|
39
|
+
switch (field) {
|
|
40
|
+
case 'timestamp': {
|
|
41
|
+
const m = line.match(/\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}:\d{2}/);
|
|
42
|
+
return m ? new Date(m[0]).getTime() : null;
|
|
43
|
+
}
|
|
44
|
+
case 'status': {
|
|
45
|
+
const m = line.match(/"\s+(\d{3})\s+/);
|
|
46
|
+
return m ? parseInt(m[1], 10) : null;
|
|
47
|
+
}
|
|
48
|
+
case 'size': {
|
|
49
|
+
const m = line.match(/\s(\d+)$/);
|
|
50
|
+
return m ? parseInt(m[1], 10) : null;
|
|
51
|
+
}
|
|
52
|
+
default:
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
static inRange(value, from, to) {
|
|
57
|
+
const lo = from !== undefined ? Number(from) : -Infinity;
|
|
58
|
+
const hi = to !== undefined ? Number(to) : Infinity;
|
|
59
|
+
return value >= lo && value <= hi;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
exports.RangeOperator = RangeOperator;
|
|
63
|
+
//# sourceMappingURL=RangeOperator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RangeOperator.js","sourceRoot":"","sources":["../../../src/query/operators/RangeOperator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FuzzyMatcher.ts
|
|
3
|
+
* Performs approximate string matching using Jaro-Winkler similarity.
|
|
4
|
+
* Used for fuzzy search queries (e.g., ~"eror" finds "error").
|
|
5
|
+
*/
|
|
6
|
+
export declare class FuzzyMatcher {
|
|
7
|
+
private term;
|
|
8
|
+
private threshold;
|
|
9
|
+
constructor(term: string, threshold?: number);
|
|
10
|
+
/**
|
|
11
|
+
* Check if a line contains a token similar to the search term.
|
|
12
|
+
*/
|
|
13
|
+
test(line: string): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Find approximate matches in a line and return their positions.
|
|
16
|
+
*/
|
|
17
|
+
findMatches(line: string): Array<{
|
|
18
|
+
token: string;
|
|
19
|
+
score: number;
|
|
20
|
+
start: number;
|
|
21
|
+
end: number;
|
|
22
|
+
}>;
|
|
23
|
+
/**
|
|
24
|
+
* Jaro-Winkler similarity between two strings.
|
|
25
|
+
* Returns a value in [0, 1].
|
|
26
|
+
*/
|
|
27
|
+
similarity(s1: string, s2: string): number;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=FuzzyMatcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FuzzyMatcher.d.ts","sourceRoot":"","sources":["../../../src/query/regex/FuzzyMatcher.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,qBAAa,YAAY;IACvB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,SAAS,CAAS;gBAEd,IAAI,EAAE,MAAM,EAAE,SAAS,GAAE,MAAa;IAKlD;;OAEG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAK3B;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAgB9F;;;OAGG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM;CA6C3C"}
|