mastra-browser-core
Version:
The core foundation of the Mastra framework, providing essential components and interfaces for building AI-powered applications.
1 lines • 18 kB
Source Map (JSON)
{"version":3,"sources":["../src/vector/filter/base.ts"],"names":["__name","__publicField"],"mappings":"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","file":"chunk-NXHJJ76H.cjs","sourcesContent":["type BasicOperator =\n | '$eq' // Matches values equal to specified value\n | '$ne'; // Matches values not equal\n\ntype NumericOperator =\n | '$gt' // Greater than\n | '$gte' // Greater than or equal\n | '$lt' // Less than\n | '$lte'; // Less than or equal\n\ntype LogicalOperator =\n | '$and' // Joins query clauses with logical AND\n | '$not' // Inverts the effect of a query expression\n | '$nor' // Joins query clauses with logical NOR\n | '$or'; // Joins query clauses with logical OR\n\ntype ArrayOperator =\n | '$all' // Matches arrays containing all elements\n | '$in' // Matches any value in array\n | '$nin' // Matches none of the values in array\n | '$elemMatch'; // Matches documents that contain an array field with at least one element that matches all the specified query criteria\n\ntype ElementOperator = '$exists'; // Matches documents that have the specified field\n\ntype RegexOperator = '$regex' | '$options'; // Matches documents that have the specified field\n\n// Union of all supported operators\ntype QueryOperator =\n | BasicOperator\n | NumericOperator\n | LogicalOperator\n | ArrayOperator\n | ElementOperator\n | RegexOperator;\n\n// Type for a field condition using an operator\ntype OperatorCondition = {\n [K in QueryOperator]?: any;\n};\n\n// Type for a field condition that can be either a direct value or use operators\ntype FieldCondition = OperatorCondition | any;\n\n// Type for the overall filter structure\ntype VectorFilter =\n | {\n [field: string]: FieldCondition | VectorFilter;\n }\n | null\n | undefined;\n\ntype OperatorSupport = {\n logical?: LogicalOperator[];\n array?: ArrayOperator[];\n basic?: BasicOperator[];\n numeric?: NumericOperator[];\n element?: ElementOperator[];\n regex?: RegexOperator[];\n custom?: string[];\n};\n\n// Base abstract class for filter translators\nabstract class BaseFilterTranslator {\n abstract translate(filter: VectorFilter): unknown;\n\n /**\n * Operator type checks\n */\n protected isOperator(key: string): key is QueryOperator {\n return key.startsWith('$');\n }\n\n protected static readonly BASIC_OPERATORS: BasicOperator[] = ['$eq', '$ne'];\n protected static readonly NUMERIC_OPERATORS: NumericOperator[] = ['$gt', '$gte', '$lt', '$lte'];\n protected static readonly ARRAY_OPERATORS: ArrayOperator[] = ['$in', '$nin', '$all', '$elemMatch'];\n protected static readonly LOGICAL_OPERATORS: LogicalOperator[] = ['$and', '$or', '$not', '$nor'];\n protected static readonly ELEMENT_OPERATORS: ElementOperator[] = ['$exists'];\n protected static readonly REGEX_OPERATORS: RegexOperator[] = ['$regex', '$options'];\n\n public static readonly DEFAULT_OPERATORS = {\n logical: BaseFilterTranslator.LOGICAL_OPERATORS,\n basic: BaseFilterTranslator.BASIC_OPERATORS,\n numeric: BaseFilterTranslator.NUMERIC_OPERATORS,\n array: BaseFilterTranslator.ARRAY_OPERATORS,\n element: BaseFilterTranslator.ELEMENT_OPERATORS,\n regex: BaseFilterTranslator.REGEX_OPERATORS,\n };\n\n protected isLogicalOperator(key: string): key is LogicalOperator {\n return BaseFilterTranslator.DEFAULT_OPERATORS.logical.includes(key as LogicalOperator);\n }\n\n protected isBasicOperator(key: string): key is BasicOperator {\n return BaseFilterTranslator.DEFAULT_OPERATORS.basic.includes(key as BasicOperator);\n }\n\n protected isNumericOperator(key: string): key is NumericOperator {\n return BaseFilterTranslator.DEFAULT_OPERATORS.numeric.includes(key as NumericOperator);\n }\n\n protected isArrayOperator(key: string): key is ArrayOperator {\n return BaseFilterTranslator.DEFAULT_OPERATORS.array.includes(key as ArrayOperator);\n }\n\n protected isElementOperator(key: string): key is ElementOperator {\n return BaseFilterTranslator.DEFAULT_OPERATORS.element.includes(key as ElementOperator);\n }\n\n protected isRegexOperator(key: string): key is RegexOperator {\n return BaseFilterTranslator.DEFAULT_OPERATORS.regex.includes(key as RegexOperator);\n }\n\n protected isFieldOperator(key: string): key is QueryOperator {\n return this.isOperator(key) && !this.isLogicalOperator(key);\n }\n\n protected isCustomOperator(key: string): boolean {\n const support = this.getSupportedOperators();\n return support.custom?.includes(key) ?? false;\n }\n\n protected getSupportedOperators(): OperatorSupport {\n return BaseFilterTranslator.DEFAULT_OPERATORS;\n }\n\n protected isValidOperator(key: string): boolean {\n const support = this.getSupportedOperators();\n const allSupported = Object.values(support).flat();\n return allSupported.includes(key as QueryOperator);\n }\n\n /**\n * Value normalization for comparison operators\n */\n protected normalizeComparisonValue(value: any): any {\n if (value instanceof Date) {\n return value.toISOString();\n }\n\n // Handle -0 case\n if (typeof value === 'number' && Object.is(value, -0)) {\n return 0;\n }\n return value;\n }\n\n /**\n * Helper method to simulate $all operator using $and + $eq when needed.\n * Some vector stores don't support $all natively.\n */\n protected simulateAllOperator(field: string, values: any[]): VectorFilter {\n return {\n $and: values.map(value => ({\n [field]: { $in: [this.normalizeComparisonValue(value)] },\n })),\n };\n }\n\n /**\n * Utility functions for type checking\n */\n protected isPrimitive(value: any): boolean {\n return (\n value === null ||\n value === undefined ||\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n );\n }\n\n protected isRegex(value: any): boolean {\n return value instanceof RegExp;\n }\n\n protected isEmpty(obj: any): boolean {\n return obj === null || obj === undefined || (typeof obj === 'object' && Object.keys(obj).length === 0);\n }\n\n protected static readonly ErrorMessages = {\n UNSUPPORTED_OPERATOR: (op: string) => `Unsupported operator: ${op}`,\n INVALID_LOGICAL_OPERATOR_LOCATION: (op: string, path: string) =>\n `Logical operator ${op} cannot be used at field level: ${path}`,\n NOT_REQUIRES_OBJECT: `$not operator requires an object`,\n NOT_CANNOT_BE_EMPTY: `$not operator cannot be empty`,\n INVALID_LOGICAL_OPERATOR_CONTENT: (path: string) =>\n `Logical operators must contain field conditions, not direct operators: ${path}`,\n INVALID_TOP_LEVEL_OPERATOR: (op: string) => `Invalid top-level operator: ${op}`,\n ELEM_MATCH_REQUIRES_OBJECT: `$elemMatch requires an object with conditions`,\n } as const;\n\n /**\n * Helper to handle array value normalization consistently\n */\n protected normalizeArrayValues(values: any[]): any[] {\n return values.map(value => this.normalizeComparisonValue(value));\n }\n\n protected validateFilter(filter: VectorFilter): void {\n const validation = this.validateFilterSupport(filter);\n if (!validation.supported) {\n throw new Error(validation.messages.join(', '));\n }\n }\n\n /**\n * Validates if a filter structure is supported by the specific vector DB\n * and returns detailed validation information.\n */\n private validateFilterSupport(\n node: VectorFilter | FieldCondition,\n path: string = '',\n ): {\n supported: boolean;\n messages: string[];\n } {\n const messages: string[] = [];\n\n // Handle primitives and empty values\n if (this.isPrimitive(node) || this.isEmpty(node)) {\n return { supported: true, messages: [] };\n }\n\n // Handle arrays\n if (Array.isArray(node)) {\n const arrayResults = node.map(item => this.validateFilterSupport(item, path));\n const arrayMessages = arrayResults.flatMap(r => r.messages);\n return {\n supported: arrayResults.every(r => r.supported),\n messages: arrayMessages,\n };\n }\n\n // Process object entries\n const nodeObj = node as Record<string, any>;\n let isSupported = true;\n\n for (const [key, value] of Object.entries(nodeObj)) {\n const newPath = path ? `${path}.${key}` : key;\n // Check if the key is an operator\n if (this.isOperator(key)) {\n if (!this.isValidOperator(key)) {\n isSupported = false;\n messages.push(BaseFilterTranslator.ErrorMessages.UNSUPPORTED_OPERATOR(key));\n continue;\n }\n\n // Add check for non-logical operators at top level\n if (!path && !this.isLogicalOperator(key)) {\n isSupported = false;\n messages.push(BaseFilterTranslator.ErrorMessages.INVALID_TOP_LEVEL_OPERATOR(key));\n continue;\n }\n\n // In the translate method or wherever operators are handled\n if (key === '$elemMatch' && (typeof value !== 'object' || Array.isArray(value))) {\n isSupported = false;\n messages.push(BaseFilterTranslator.ErrorMessages.ELEM_MATCH_REQUIRES_OBJECT);\n continue;\n }\n\n // Special validation for logical operators\n if (this.isLogicalOperator(key)) {\n if (key === '$not') {\n if (Array.isArray(value) || typeof value !== 'object') {\n isSupported = false;\n messages.push(BaseFilterTranslator.ErrorMessages.NOT_REQUIRES_OBJECT);\n continue;\n }\n if (this.isEmpty(value)) {\n isSupported = false;\n messages.push(BaseFilterTranslator.ErrorMessages.NOT_CANNOT_BE_EMPTY);\n continue;\n }\n // $not can be used at field level or top level\n continue;\n }\n // Other logical operators can only be at top level or nested in logical operators\n if (path && !this.isLogicalOperator(path.split('.').pop()!)) {\n isSupported = false;\n messages.push(BaseFilterTranslator.ErrorMessages.INVALID_LOGICAL_OPERATOR_LOCATION(key, newPath));\n continue;\n }\n\n if (Array.isArray(value)) {\n const hasDirectOperators = value.some(\n item =>\n typeof item === 'object' &&\n Object.keys(item).length === 1 &&\n this.isFieldOperator(Object.keys(item)[0]!),\n );\n\n if (hasDirectOperators) {\n isSupported = false;\n messages.push(BaseFilterTranslator.ErrorMessages.INVALID_LOGICAL_OPERATOR_CONTENT(newPath));\n continue;\n }\n }\n }\n }\n\n // Recursively validate nested value\n const nestedValidation = this.validateFilterSupport(value, newPath);\n if (!nestedValidation.supported) {\n isSupported = false;\n messages.push(...nestedValidation.messages);\n }\n }\n\n return { supported: isSupported, messages };\n }\n}\n\n// Export types and base class\nexport {\n type QueryOperator,\n type BasicOperator,\n type NumericOperator,\n type LogicalOperator,\n type ArrayOperator,\n type RegexOperator,\n type ElementOperator,\n type VectorFilter,\n type FieldCondition,\n type OperatorCondition,\n type OperatorSupport,\n BaseFilterTranslator,\n};\n"]}