{"version":3,"file":"evaluators.cjs","sources":["../../../src/query/evaluators.ts"],"sourcesContent":["import { evaluateOperandOnNamespacedRow } from \"./extractors.js\"\nimport { compareValues, convertLikeToRegex, isValueInArray } from \"./utils.js\"\nimport type {\n  Comparator,\n  Condition,\n  ConditionOperand,\n  LogicalOperator,\n  SimpleCondition,\n  Where,\n  WhereCallback,\n} from \"./schema.js\"\nimport type { NamespacedRow } from \"../types.js\"\n\n/**\n * Evaluates a Where clause (which is always an array of conditions and/or callbacks) against a nested row structure\n */\nexport function evaluateWhereOnNamespacedRow(\n  namespacedRow: NamespacedRow,\n  where: Where,\n  mainTableAlias?: string,\n  joinedTableAlias?: string\n): boolean {\n  // Where is always an array of conditions and/or callbacks\n  // Evaluate all items and combine with AND logic\n  return where.every((item) => {\n    if (typeof item === `function`) {\n      return (item as WhereCallback)(namespacedRow)\n    } else {\n      return evaluateConditionOnNamespacedRow(\n        namespacedRow,\n        item as Condition,\n        mainTableAlias,\n        joinedTableAlias\n      )\n    }\n  })\n}\n\n/**\n * Evaluates a condition against a nested row structure\n */\nexport function evaluateConditionOnNamespacedRow(\n  namespacedRow: NamespacedRow,\n  condition: Condition,\n  mainTableAlias?: string,\n  joinedTableAlias?: string\n): boolean {\n  // Handle simple conditions with exactly 3 elements\n  if (condition.length === 3 && !Array.isArray(condition[0])) {\n    const [left, comparator, right] = condition as SimpleCondition\n    return evaluateSimpleConditionOnNamespacedRow(\n      namespacedRow,\n      left,\n      comparator,\n      right,\n      mainTableAlias,\n      joinedTableAlias\n    )\n  }\n\n  // Handle flat composite conditions (multiple conditions in a single array)\n  if (\n    condition.length > 3 &&\n    !Array.isArray(condition[0]) &&\n    typeof condition[1] === `string` &&\n    ![`and`, `or`].includes(condition[1] as string)\n  ) {\n    // Start with the first condition (first 3 elements)\n    let result = evaluateSimpleConditionOnNamespacedRow(\n      namespacedRow,\n      condition[0],\n      condition[1] as Comparator,\n      condition[2],\n      mainTableAlias,\n      joinedTableAlias\n    )\n\n    // Process the rest in groups: logical operator, then 3 elements for each condition\n    for (let i = 3; i < condition.length; i += 4) {\n      const logicalOp = condition[i] as LogicalOperator\n\n      // Make sure we have a complete condition to evaluate\n      if (i + 3 <= condition.length) {\n        const nextResult = evaluateSimpleConditionOnNamespacedRow(\n          namespacedRow,\n          condition[i + 1],\n          condition[i + 2] as Comparator,\n          condition[i + 3],\n          mainTableAlias,\n          joinedTableAlias\n        )\n\n        // Apply the logical operator\n        if (logicalOp === `and`) {\n          result = result && nextResult\n        } else {\n          // logicalOp === `or`\n          result = result || nextResult\n        }\n      }\n    }\n\n    return result\n  }\n\n  // Handle nested composite conditions where the first element is an array\n  if (condition.length > 0 && Array.isArray(condition[0])) {\n    // Start with the first condition\n    let result = evaluateConditionOnNamespacedRow(\n      namespacedRow,\n      condition[0] as Condition,\n      mainTableAlias,\n      joinedTableAlias\n    )\n\n    // Process the rest of the conditions and logical operators in pairs\n    for (let i = 1; i < condition.length; i += 2) {\n      if (i + 1 >= condition.length) break // Make sure we have a pair\n\n      const operator = condition[i] as LogicalOperator\n      const nextCondition = condition[i + 1] as Condition\n\n      // Apply the logical operator\n      if (operator === `and`) {\n        result =\n          result &&\n          evaluateConditionOnNamespacedRow(\n            namespacedRow,\n            nextCondition,\n            mainTableAlias,\n            joinedTableAlias\n          )\n      } else {\n        // logicalOp === `or`\n        result =\n          result ||\n          evaluateConditionOnNamespacedRow(\n            namespacedRow,\n            nextCondition,\n            mainTableAlias,\n            joinedTableAlias\n          )\n      }\n    }\n\n    return result\n  }\n\n  // Fallback - this should not happen with valid conditions\n  return true\n}\n\n/**\n * Evaluates a simple condition against a nested row structure\n */\nexport function evaluateSimpleConditionOnNamespacedRow(\n  namespacedRow: Record<string, unknown>,\n  left: ConditionOperand,\n  comparator: Comparator,\n  right: ConditionOperand,\n  mainTableAlias?: string,\n  joinedTableAlias?: string\n): boolean {\n  const leftValue = evaluateOperandOnNamespacedRow(\n    namespacedRow,\n    left,\n    mainTableAlias,\n    joinedTableAlias\n  )\n\n  const rightValue = evaluateOperandOnNamespacedRow(\n    namespacedRow,\n    right,\n    mainTableAlias,\n    joinedTableAlias\n  )\n\n  // The rest of the function remains the same as evaluateSimpleCondition\n  switch (comparator) {\n    case `=`:\n      return leftValue === rightValue\n    case `!=`:\n      return leftValue !== rightValue\n    case `<`:\n      return compareValues(leftValue, rightValue, `<`)\n    case `<=`:\n      return compareValues(leftValue, rightValue, `<=`)\n    case `>`:\n      return compareValues(leftValue, rightValue, `>`)\n    case `>=`:\n      return compareValues(leftValue, rightValue, `>=`)\n    case `like`:\n    case `not like`:\n      if (typeof leftValue === `string` && typeof rightValue === `string`) {\n        // Convert SQL LIKE pattern to proper regex pattern\n        const pattern = convertLikeToRegex(rightValue)\n        const matches = new RegExp(`^${pattern}$`, `i`).test(leftValue)\n        return comparator === `like` ? matches : !matches\n      }\n      return comparator === `like` ? false : true\n    case `in`:\n      // If right value is not an array, we can't do an IN operation\n      if (!Array.isArray(rightValue)) {\n        return false\n      }\n\n      // For empty arrays, nothing is contained in them\n      if (rightValue.length === 0) {\n        return false\n      }\n\n      // Handle array-to-array comparison (check if any element in leftValue exists in rightValue)\n      if (Array.isArray(leftValue)) {\n        return leftValue.some((item) => isValueInArray(item, rightValue))\n      }\n\n      // Handle single value comparison\n      return isValueInArray(leftValue, rightValue)\n\n    case `not in`:\n      // If right value is not an array, everything is \"not in\" it\n      if (!Array.isArray(rightValue)) {\n        return true\n      }\n\n      // For empty arrays, everything is \"not in\" them\n      if (rightValue.length === 0) {\n        return true\n      }\n\n      // Handle array-to-array comparison (check if no element in leftValue exists in rightValue)\n      if (Array.isArray(leftValue)) {\n        return !leftValue.some((item) => isValueInArray(item, rightValue))\n      }\n\n      // Handle single value comparison\n      return !isValueInArray(leftValue, rightValue)\n\n    case `is`:\n      return leftValue === rightValue\n    case `is not`:\n      // Properly handle null/undefined checks\n      if (rightValue === null) {\n        return leftValue !== null && leftValue !== undefined\n      }\n      return leftValue !== rightValue\n    default:\n      return false\n  }\n}\n"],"names":["evaluateOperandOnNamespacedRow","compareValues","convertLikeToRegex","isValueInArray"],"mappings":"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"}