@ja-platform/db 0.0.0-dev-20261028223022
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 +521 -0
- package/dist/@types/Schema.d.ts +1 -0
- package/dist/@types/app.d.ts +12 -0
- package/dist/@types/browser.d.ts +31 -0
- package/dist/@types/credentials/ApiCredentials.d.ts +18 -0
- package/dist/@types/credentials/MobileCredentials.d.ts +22 -0
- package/dist/@types/credentials/index.d.ts +2 -0
- package/dist/@types/database/Batch.d.ts +61 -0
- package/dist/@types/database/Collection.d.ts +85 -0
- package/dist/@types/database/Database.d.ts +22 -0
- package/dist/@types/database/DatabaseObject.d.ts +51 -0
- package/dist/@types/database/GenericDatabase.d.ts +4 -0
- package/dist/@types/database/JourneyAPIAdapter.d.ts +45 -0
- package/dist/@types/database/ObjectDisplayScope.d.ts +22 -0
- package/dist/@types/database/OnlineDB.d.ts +8 -0
- package/dist/@types/database/adapters/BaseAdapter.d.ts +26 -0
- package/dist/@types/database/adapters/DatabaseAdapter.d.ts +22 -0
- package/dist/@types/database/adapters/WebSQLAdapter.d.ts +50 -0
- package/dist/@types/index.d.ts +2 -0
- package/dist/@types/query/InternalQuery.d.ts +17 -0
- package/dist/@types/query/Query.d.ts +133 -0
- package/dist/@types/query/getPreloadRelationships.d.ts +9 -0
- package/dist/@types/query/queryOperations.d.ts +87 -0
- package/dist/@types/types/Attachment.d.ts +104 -0
- package/dist/@types/types/Location.d.ts +18 -0
- package/dist/@types/types/ObjectData.d.ts +12 -0
- package/dist/@types/types/TypeOperations.d.ts +42 -0
- package/dist/@types/utils/FunctionQueue.d.ts +32 -0
- package/dist/@types/utils/JourneyPromise.d.ts +2 -0
- package/dist/@types/utils/base64.d.ts +4 -0
- package/dist/@types/utils/retryableFetch.d.ts +3 -0
- package/dist/Schema.js +6 -0
- package/dist/Schema.js.map +1 -0
- package/dist/app.js +30 -0
- package/dist/app.js.map +1 -0
- package/dist/browser.js +77 -0
- package/dist/browser.js.map +1 -0
- package/dist/credentials/ApiCredentials.js +61 -0
- package/dist/credentials/ApiCredentials.js.map +1 -0
- package/dist/credentials/MobileCredentials.js +73 -0
- package/dist/credentials/MobileCredentials.js.map +1 -0
- package/dist/credentials/index.js +19 -0
- package/dist/credentials/index.js.map +1 -0
- package/dist/database/Batch.js +189 -0
- package/dist/database/Batch.js.map +1 -0
- package/dist/database/Collection.js +69 -0
- package/dist/database/Collection.js.map +1 -0
- package/dist/database/Database.js +47 -0
- package/dist/database/Database.js.map +1 -0
- package/dist/database/DatabaseObject.js +646 -0
- package/dist/database/DatabaseObject.js.map +1 -0
- package/dist/database/GenericDatabase.js +3 -0
- package/dist/database/GenericDatabase.js.map +1 -0
- package/dist/database/JourneyAPIAdapter.js +357 -0
- package/dist/database/JourneyAPIAdapter.js.map +1 -0
- package/dist/database/ObjectDisplayScope.js +117 -0
- package/dist/database/ObjectDisplayScope.js.map +1 -0
- package/dist/database/OnlineDB.js +16 -0
- package/dist/database/OnlineDB.js.map +1 -0
- package/dist/database/adapters/BaseAdapter.js +66 -0
- package/dist/database/adapters/BaseAdapter.js.map +1 -0
- package/dist/database/adapters/DatabaseAdapter.js +3 -0
- package/dist/database/adapters/DatabaseAdapter.js.map +1 -0
- package/dist/database/adapters/WebSQLAdapter.js +343 -0
- package/dist/database/adapters/WebSQLAdapter.js.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/query/InternalQuery.js +3 -0
- package/dist/query/InternalQuery.js.map +1 -0
- package/dist/query/Query.js +414 -0
- package/dist/query/Query.js.map +1 -0
- package/dist/query/getPreloadRelationships.js +45 -0
- package/dist/query/getPreloadRelationships.js.map +1 -0
- package/dist/query/queryOperations.js +678 -0
- package/dist/query/queryOperations.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/types/Attachment.js +198 -0
- package/dist/types/Attachment.js.map +1 -0
- package/dist/types/Location.js +38 -0
- package/dist/types/Location.js.map +1 -0
- package/dist/types/ObjectData.js +3 -0
- package/dist/types/ObjectData.js.map +1 -0
- package/dist/types/TypeOperations.js +267 -0
- package/dist/types/TypeOperations.js.map +1 -0
- package/dist/utils/FunctionQueue.js +91 -0
- package/dist/utils/FunctionQueue.js.map +1 -0
- package/dist/utils/JourneyPromise.js +3 -0
- package/dist/utils/JourneyPromise.js.map +1 -0
- package/dist/utils/base64.js +40 -0
- package/dist/utils/base64.js.map +1 -0
- package/dist/utils/retryableFetch.js +57 -0
- package/dist/utils/retryableFetch.js.map +1 -0
- package/package.json +55 -0
- package/readme.md +37 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queryOperations.js","sourceRoot":"","sources":["../../src/query/queryOperations.ts"],"names":[],"mappings":"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","sourcesContent":["import { operationsFor } from '../types/TypeOperations';\n// # Query\n// This module handles the parsing and representation of query expressions.\n// It contains the logic to filter a single object based on an expression.\n// It is up to the database adapters to perform optimised queries based on an index.\n\nimport { SchemaModelType, Field, Day, QueryType } from '@ja-platform/parser-schema';\nimport { ArrayType } from '@ja-platform/parser-type-system';\n\nimport { ObjectData } from '../types/ObjectData';\n\n// Build an expression from a hash such as {make: 'Nokia', model: '5800'}\nexport function expressionFromHash(scopeType: SchemaModelType, hash: any): Expression {\n let operations: Operation[] = [];\n for (let key in hash) {\n if (hash.hasOwnProperty(key)) {\n let value = hash[key];\n const attribute = scopeType.getAttribute(key);\n if (attribute == null) {\n throw new Error(`'${key}' is not defined on '${scopeType.name}'`);\n }\n if (SchemaModelType.isInstanceOf(attribute.type) && value != null) {\n value = value.id;\n }\n const operation = new Operation(attribute, '=', value);\n operations.push(operation);\n }\n }\n return new AndExpression(operations);\n}\n\n// ## Operation\n// An operation has an attribute (variable), operator and (constant) value to compare with.\n\nfunction discardMillis(ms) {\n return Math.floor(ms / 1000) * 1000;\n}\n\nexport interface Expression {\n normalize(): NormalizedExpression;\n evaluate(object: Partial<ObjectData>): boolean;\n toOriginalExpression(): any[];\n}\n\nexport class Operation implements Expression {\n attribute: Field;\n operator: string;\n value: any;\n\n constructor(attribute: Field, operator: string, value: any) {\n this.attribute = attribute;\n this.operator = operator;\n this.value = value;\n }\n\n normalize(): NormalizedExpression {\n if (this.operator == 'in') {\n // Allows using this in indexes\n return new OrExpression(this.value.map((v) => new AndExpression([new Operation(this.attribute, '=', v)])));\n }\n return new OrExpression([new AndExpression([this])]);\n }\n\n attributes() {\n return [this.attribute];\n }\n\n evaluate(object: Partial<ObjectData>) {\n let attributeValue;\n if (this.attribute.relationship) {\n attributeValue = object.belongs_to[this.attribute.relationship];\n if (typeof this.value == 'undefined') {\n // Most likely an incorrect parameter was passed to the query.\n // We don't want to interpret this the same as null.\n return false;\n }\n } else if (this.attribute.name == 'id') {\n attributeValue = object.id;\n } else {\n const rawAttributeValue = object.attributes[this.attribute.name];\n if (rawAttributeValue == null) {\n attributeValue = null;\n } else {\n attributeValue = operationsFor(this.attribute.type).valueFromJSON(rawAttributeValue);\n }\n }\n const compareDiff = compare(attributeValue, this.value);\n if (this.operator == '=') {\n if (compareDiff !== null) {\n return compareDiff === 0;\n }\n if (Array.isArray(attributeValue) && !Array.isArray(this.value)) {\n return false;\n }\n return attributeValue == this.value;\n } else if (this.operator == '!=') {\n if (compareDiff !== null) {\n return compareDiff !== 0;\n }\n if (Array.isArray(attributeValue) && !Array.isArray(this.value)) {\n return true;\n }\n return attributeValue != this.value;\n } else if (this.operator == '>') {\n if (compareDiff === null) {\n return false;\n }\n return compareDiff > 0;\n } else if (this.operator == '<') {\n if (compareDiff === null) {\n return false;\n }\n return compareDiff < 0;\n } else if (this.operator == '>=') {\n if (compareDiff === null) {\n return false;\n }\n return compareDiff >= 0;\n } else if (this.operator == '<=') {\n if (compareDiff === null) {\n return false;\n }\n return compareDiff <= 0;\n } else if (this.operator == 'contains') {\n if (typeof attributeValue == 'string' && typeof this.value == 'string') {\n return attributeValue.toLowerCase().indexOf(this.value.toLowerCase()) >= 0;\n } else if (Array.isArray(attributeValue) && Array.isArray(this.value)) {\n for (let child of this.value) {\n if (attributeValue!.indexOf(child) < 0) {\n return false;\n }\n }\n return true;\n } else if (Array.isArray(attributeValue)) {\n return attributeValue!.indexOf(this.value) >= 0;\n } else {\n return false;\n }\n } else if (this.operator == 'starts with') {\n if (typeof attributeValue == 'string' && typeof this.value == 'string') {\n return attributeValue.toLowerCase().indexOf(this.value.toLowerCase()) === 0;\n } else {\n return false;\n }\n } else if (this.operator == 'in') {\n if (Array.isArray(this.value)) {\n if (Array.isArray(attributeValue)) {\n return (\n this.value.findIndex((value) => {\n return attributeValue.indexOf(value) >= 0;\n }) >= 0\n );\n } else {\n return (\n this.value.findIndex((value) => {\n const compared = compare(attributeValue, value);\n return compared == 0 || (compared == null && value == attributeValue);\n }) >= 0\n );\n }\n } else {\n throw new Error(\"Array value is required for 'in' operator\");\n }\n } else if (this.operator == 'not in') {\n if (Array.isArray(this.value)) {\n if (Array.isArray(attributeValue)) {\n return (\n this.value.findIndex((value) => {\n return attributeValue.indexOf(value) >= 0;\n }) == -1\n );\n } else {\n return (\n this.value.findIndex((value) => {\n const compared = compare(attributeValue, value);\n return compared == 0 || (compared == null && value == attributeValue);\n }) == -1\n );\n }\n } else {\n throw new Error(\"Array value is required for 'not in' operator\");\n }\n } else {\n throw Error('Operator ' + this.operator + ' is not implemented yet');\n }\n }\n\n toString() {\n return this.attribute.name + ' ' + this.operator + ' ' + this.value;\n }\n\n toOriginalExpression() {\n if (this.attribute.relationship) {\n // Works for both relationships (user = ?) and relationship ids (user_id = ?)\n return [this.attribute.relationship + '_id ' + this.operator + ' ?', this.value];\n } else {\n return [this.attribute.name + ' ' + this.operator + ' ?', this.value];\n }\n }\n}\n\nfunction compare(a: any, b: any) {\n let compareDiff = null;\n if (typeof a == 'number' && typeof b == 'number') {\n compareDiff = a - b;\n } else if (typeof a == 'string' && typeof b == 'string') {\n if (a < b) {\n compareDiff = -1;\n } else if (a > b) {\n compareDiff = 1;\n } else {\n compareDiff = 0;\n }\n } else if (a instanceof Date && b instanceof Date) {\n // Compare seconds only\n compareDiff = discardMillis(a.getTime()) - discardMillis(b.getTime());\n } else if (Day.isDay(a) || Day.isDay(b)) {\n // New syntax only\n try {\n // Convert both to Days, in the local timezone.\n // Also works for JSON strings.\n compareDiff = new Day(a).valueOf() - new Day(b).valueOf();\n } catch (err) {\n compareDiff = null;\n }\n } else if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length != b.length) {\n return null;\n }\n for (let i = 0; i < a.length && i < b.length; i++) {\n const child = compare(a[i], b[i]);\n if (child != 0) {\n return null;\n }\n }\n return 0;\n }\n return compareDiff;\n}\n\n// ## RelationMatch\n// A RelationMatch searches for a relationship match\nexport class RelationMatch implements Expression {\n name: string;\n id: string;\n\n constructor(name: string, id: string) {\n this.name = name;\n this.id = id;\n }\n\n normalize() {\n return new OrExpression([new AndExpression([this])]);\n }\n\n evaluate(object: Partial<ObjectData>) {\n const relatedId = object.belongs_to[this.name];\n return relatedId == this.id;\n }\n\n toString() {\n return this.name + ' = ' + this.id;\n }\n\n toOriginalExpression() {\n return [this.name + '_id = ?', this.id];\n }\n}\n\n// ## AndExpression\n// Takes any number of expressions, and combine them with an \"and\".\nexport class AndExpression implements Expression {\n constructor(public operands: Expression[]) {}\n\n join(otherAnd: AndExpression) {\n const ops = this.operands.concat(otherAnd.operands);\n return new AndExpression(ops);\n }\n\n normalize() {\n let i: number;\n // Step 1: filter out TrueExpression\n let operands: Expression[] = [];\n for (i = 0; i < this.operands.length; i++) {\n const op = this.operands[i];\n if (!(op instanceof TrueExpression)) {\n operands.push(op);\n }\n }\n if (operands.length === 0) {\n return new TrueExpression().normalize();\n } else if (operands.length == 1) {\n return operands[0].normalize();\n } else if (operands.length > 2) {\n const a = new AndExpression(operands.slice(0, 2));\n const b = new AndExpression(operands.slice(2));\n return new AndExpression([a, b]).normalize();\n } else {\n const left = operands[0].normalize().operands;\n const right = operands[1].normalize().operands;\n let newOperands = [];\n for (i = 0; i < left.length; i++) {\n for (let j = 0; j < right.length; j++) {\n newOperands.push(left[i].join(right[j]));\n }\n }\n return new OrExpression(newOperands);\n }\n }\n\n evaluate(object: Partial<ObjectData>) {\n for (let i = 0; i < this.operands.length; i++) {\n const operand = this.operands[i];\n if (!operand.evaluate(object)) {\n return false;\n }\n }\n return true;\n }\n\n toString() {\n let s = '(';\n for (let i = 0; i < this.operands.length; i++) {\n const operand = this.operands[i];\n s += operand.toString();\n if (i != this.operands.length - 1) {\n s += ' and ';\n }\n }\n s += ')';\n return s;\n }\n\n toOriginalExpression() {\n let args = [];\n let s = '(';\n for (let i = 0; i < this.operands.length; i++) {\n const operand = this.operands[i];\n if (operand instanceof TrueExpression) continue;\n let opPair = operand.toOriginalExpression();\n if (opPair[0] == '') {\n // nested TrueExpression\n continue;\n }\n if (s.length > 1) {\n // Not the first operand\n s += ' and ';\n }\n s += opPair[0];\n args.push.apply(args, opPair.slice(1));\n }\n s += ')';\n if (s.length == 2) {\n return new TrueExpression().toOriginalExpression();\n }\n return [s, ...args];\n }\n}\n\n// ## OrExpression\n// Takes any number of expressions, and combine them with an \"or\".\nexport class OrExpression<T extends Expression = Expression> implements Expression {\n constructor(public operands: T[]) {}\n\n normalize() {\n const newOperands: AndExpression[] = [];\n this.operands.forEach(function (op) {\n const norm: NormalizedExpression = op.normalize();\n norm.operands.forEach(function (subop) {\n newOperands.push(subop);\n });\n });\n return new OrExpression<AndExpression>(newOperands);\n }\n\n evaluate(object: Partial<ObjectData>) {\n for (let i = 0; i < this.operands.length; i++) {\n const operand = this.operands[i];\n if (operand.evaluate(object)) {\n return true;\n }\n }\n return false;\n }\n\n toString() {\n let s = '(';\n for (let i = 0; i < this.operands.length; i++) {\n const operand = this.operands[i];\n s += operand.toString();\n if (i != this.operands.length - 1) {\n s += ' or ';\n }\n }\n s += ')';\n return s;\n }\n\n toOriginalExpression() {\n let args = [];\n let s = '(';\n for (let i = 0; i < this.operands.length; i++) {\n const operand = this.operands[i];\n if (operand instanceof TrueExpression) {\n // One TrueExpression makes the entire OR clause true\n return operand.toOriginalExpression();\n }\n const opPair = operand.toOriginalExpression();\n s += opPair[0];\n args.push.apply(args, opPair.slice(1));\n if (i != this.operands.length - 1) {\n s += ' or ';\n }\n }\n s += ')';\n return [s, ...args];\n }\n}\n\nexport type NormalizedExpression = OrExpression<AndExpression>;\n\n// ## TrueExpression\n// Simple expression that is always true.\nexport class TrueExpression implements Expression {\n constructor() {}\n\n normalize() {\n return new OrExpression<AndExpression>([new AndExpression([this])]);\n }\n\n evaluate(object: ObjectData) {\n return true;\n }\n\n toString() {\n return 'true';\n }\n\n toOriginalExpression(): string[] {\n return [''];\n }\n}\n\n// We should probably support international characters as well\nfunction isLetter(character: string) {\n return (character >= 'a' && character <= 'z') || (character >= 'A' && character <= 'Z');\n}\nfunction isDigit(character: string) {\n return character >= '0' && character <= '9';\n}\n\nconst OPERATORS = ['>=', '<=', '=', '!=', '>', '<', 'starts with', 'contains', 'in', 'not in'];\nconst BOOLEAN_LOGIC = ['and', 'or'];\n\n// ## Tokenizer\n// The Tokenizer is responsible for interpreting the raw characters, and splitting the expression into\n// tokens.\nexport class Tokenizer {\n i: number = 0;\n previousPosition: number;\n private interpolatorCount: number = 0;\n\n constructor(public expression: string) {\n if (expression == null) {\n throw new Error('expression is required');\n }\n this.advance();\n }\n\n exception(message: string, start?: number, end?: number) {\n let error = new Error(message + '\\n' + this.expression + '\\n' + new Array(this.i + 1).join(' ') + '^');\n if (start == null) {\n start = this.i;\n }\n (error as any).position = start;\n (error as any).positionEnd = end == null ? start + 1 : end;\n (error as any).plainMessage = message;\n return error;\n }\n\n isWordSeparator(p: number) {\n return p >= this.expression.length || this.expression[p] == ' ';\n }\n\n isWord() {\n this.checkBuffer();\n return isLetter(this.expression[this.i]) || this.expression[this.i] == '_';\n }\n\n hasMore() {\n return this.i < this.expression.length;\n }\n\n // Read an operator, for example \"!=\" or \"starts with\".\n readOperator() {\n return this.readToken(OPERATORS);\n }\n\n // Read an \"and\" or \"or\".\n readBooleanLogic() {\n return this.readToken(BOOLEAN_LOGIC);\n }\n\n // Is the current token an \"or\"?\n isOr() {\n return this.isToken(['or']);\n }\n\n // Is the current token an \"and\"?\n isAnd() {\n return this.isToken(['and']);\n }\n\n // Are we at a closing or opening parenthesis?\n isParenthesis() {\n this.checkBuffer();\n return this.expression[this.i] == '(' || this.expression[this.i] == ')';\n }\n\n // Read a single parenthesis. Throws an exception if we are not at one.\n readParenthesis() {\n if (!this.isParenthesis()) {\n throw this.exception('Expected ( or )');\n }\n const c = this.expression[this.i];\n this.i++;\n this.advance();\n return c;\n }\n\n // Read an interpolation character \"?\"\n readInterpolator() {\n this.checkBuffer();\n if (this.expression[this.i] == '?' && (this.isWordSeparator(this.i + 1) || this.expression[this.i + 1] == ')')) {\n this.i += 1;\n this.advance();\n return this.interpolatorCount++;\n } else {\n throw this.exception('Expected ?');\n }\n }\n\n // Read a single alphanumeric word. May contain underscores.\n readWord() {\n this.checkBuffer();\n let word = '';\n word += this.expression[this.i];\n let offset = 1;\n while (\n this.expression.length > this.i + offset &&\n (isLetter(this.expression[this.i + offset]) ||\n isDigit(this.expression[this.i + offset]) ||\n this.expression[this.i + offset] == '_')\n ) {\n word += this.expression[this.i + offset++];\n }\n this.i += offset;\n this.advance();\n return word;\n }\n\n // Advance to the next non-whitespace character.\n private advance() {\n this.previousPosition = this.i - 1;\n while (this.hasMore() && this.expression[this.i] == ' ') {\n this.i++;\n }\n }\n\n private checkBuffer() {\n if (!this.hasMore()) {\n throw this.exception('Unexpected end of expression');\n }\n }\n\n // Given an array of tokens, read and return one of them at the current position.\n // Throws an exception if none of them are found.\n // Use isToken() first to check if one of the tokens is present.\n private readToken(tokens: string[]) {\n this.checkBuffer();\n for (let j = 0; j < tokens.length; j++) {\n const token = tokens[j];\n if (this.i + token.length <= this.expression.length) {\n if (token == this.expression.substring(this.i, this.i + token.length)) {\n this.i += token.length;\n this.advance();\n return token;\n }\n }\n }\n throw this.exception('Expected one of ' + JSON.stringify(tokens));\n }\n\n // Checks if one of the given array of tokens is present at the current position.\n private isToken(tokens: string[]) {\n this.checkBuffer();\n for (let j = 0; j < tokens.length; j++) {\n const token = tokens[j];\n if (this.i + token.length <= this.expression.length) {\n if (token == this.expression.substring(this.i, this.i + token.length)) {\n if (!isLetter(token[token.length - 1]) || this.isWordSeparator(this.i + token.length)) {\n return true;\n }\n }\n }\n }\n return false;\n }\n}\n\n// ## Parser\n// The parser uses the tokenizer to build an Expression object.\nexport class Parser {\n constructor(\n private scopeType: SchemaModelType,\n private tokenizer: Tokenizer,\n private args: any[]\n ) {\n if (args == null) {\n this.args = [];\n }\n }\n\n parse(): Expression {\n const e = this.parseOrExpression();\n if (this.tokenizer.hasMore()) {\n throw this.tokenizer.exception('Invalid expression (expected expression to end)');\n }\n return e;\n }\n\n /*\n expr : term ( ( AND | OR ) term ) *\n term : ( attribute operator value ) | ( \\( expression \\) )\n factor : NUMBER ;\n */\n private parseOrExpression(): Expression {\n const e = this.parseAndExpression();\n if (this.tokenizer.hasMore() && this.tokenizer.isOr()) {\n let expressions = [e];\n while (this.tokenizer.hasMore() && this.tokenizer.isOr()) {\n this.tokenizer.readBooleanLogic();\n expressions.push(this.parseAndExpression());\n }\n return new OrExpression(expressions);\n } else {\n return e;\n }\n }\n\n private parseAndExpression(): Expression {\n const e = this.parseTerm();\n if (this.tokenizer.hasMore() && this.tokenizer.isAnd()) {\n let expressions = [e];\n while (this.tokenizer.hasMore() && this.tokenizer.isAnd()) {\n this.tokenizer.readBooleanLogic();\n expressions.push(this.parseTerm());\n }\n return new AndExpression(expressions);\n } else {\n return e;\n }\n }\n\n private parseTerm(): Expression {\n if (this.tokenizer.isWord()) {\n let attributeStart = this.tokenizer.i;\n const attributeName = this.tokenizer.readWord();\n let attributeEnd = this.tokenizer.previousPosition + 1;\n const operator = this.tokenizer.readOperator();\n let interpolatorPosition = this.tokenizer.i;\n const valueIndex = this.tokenizer.readInterpolator();\n\n const attribute = this.scopeType.getAttribute(attributeName);\n if (attribute == null) {\n throw this.tokenizer.exception(\n \"'\" + attributeName + \"' is not a valid field of '\" + this.scopeType.name + \"'\",\n attributeStart,\n attributeEnd\n );\n } else if (ArrayType.isInstanceOf(attribute.type) || QueryType.isInstanceOf(attribute.type)) {\n throw this.tokenizer.exception(\n \"Cannot query by has-many field '\" + attributeName + \"'\",\n attributeStart,\n attributeEnd\n );\n }\n if (this.args.length > valueIndex) {\n let value = this.args[valueIndex];\n if (SchemaModelType.isInstanceOf(attribute.type) && value != null) {\n value = value.id;\n }\n return new Operation(attribute, operator, value);\n } else {\n throw this.tokenizer.exception('Not enough arguments to interpolate', interpolatorPosition);\n }\n } else if (this.tokenizer.isParenthesis()) {\n let c = this.tokenizer.readParenthesis();\n if (c != '(') {\n throw this.tokenizer.exception('Expected (', this.tokenizer.previousPosition);\n }\n const e = this.parseOrExpression();\n c = this.tokenizer.readParenthesis();\n if (c != ')') {\n throw this.tokenizer.exception('Expected )', this.tokenizer.previousPosition);\n }\n return e;\n } else {\n throw this.tokenizer.exception('Expected attribute name or (');\n }\n }\n}\n\nexport function parse(scopeType: SchemaModelType, expression: string, args: any[]) {\n return new Parser(scopeType, new Tokenizer(expression), args).parse();\n}\n"]}
|