logic.js 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import { SYMBOL_UNSET_FIELD_NAME, SYMBOL_LOGIC_COMMAND } from '../helper/symbol';
  2. import { isQueryCommand } from './query';
  3. export const AND = 'and';
  4. export const OR = 'or';
  5. export const NOT = 'not';
  6. export const NOR = 'nor';
  7. export var LOGIC_COMMANDS_LITERAL;
  8. (function (LOGIC_COMMANDS_LITERAL) {
  9. LOGIC_COMMANDS_LITERAL["AND"] = "and";
  10. LOGIC_COMMANDS_LITERAL["OR"] = "or";
  11. LOGIC_COMMANDS_LITERAL["NOT"] = "not";
  12. LOGIC_COMMANDS_LITERAL["NOR"] = "nor";
  13. })(LOGIC_COMMANDS_LITERAL || (LOGIC_COMMANDS_LITERAL = {}));
  14. export class LogicCommand {
  15. constructor(operator, operands, fieldName) {
  16. this._internalType = SYMBOL_LOGIC_COMMAND;
  17. Object.defineProperties(this, {
  18. _internalType: {
  19. enumerable: false,
  20. configurable: false,
  21. },
  22. });
  23. this.operator = operator;
  24. this.operands = operands;
  25. this.fieldName = fieldName || SYMBOL_UNSET_FIELD_NAME;
  26. if (this.fieldName !== SYMBOL_UNSET_FIELD_NAME) {
  27. if (Array.isArray(operands)) {
  28. operands = operands.slice();
  29. this.operands = operands;
  30. for (let i = 0, len = operands.length; i < len; i++) {
  31. const query = operands[i];
  32. if (isLogicCommand(query) || isQueryCommand(query)) {
  33. operands[i] = query._setFieldName(this.fieldName);
  34. }
  35. }
  36. }
  37. else {
  38. const query = operands;
  39. if (isLogicCommand(query) || isQueryCommand(query)) {
  40. operands = query._setFieldName(this.fieldName);
  41. }
  42. }
  43. }
  44. }
  45. _setFieldName(fieldName) {
  46. const operands = this.operands.map(operand => {
  47. if (operand instanceof LogicCommand) {
  48. return operand._setFieldName(fieldName);
  49. }
  50. else {
  51. return operand;
  52. }
  53. });
  54. const command = new LogicCommand(this.operator, operands, fieldName);
  55. return command;
  56. }
  57. and(...__expressions__) {
  58. const expressions = Array.isArray(arguments[0]) ? arguments[0] : Array.from(arguments);
  59. expressions.unshift(this);
  60. return new LogicCommand(LOGIC_COMMANDS_LITERAL.AND, expressions, this.fieldName);
  61. }
  62. or(...__expressions__) {
  63. const expressions = Array.isArray(arguments[0]) ? arguments[0] : Array.from(arguments);
  64. expressions.unshift(this);
  65. return new LogicCommand(LOGIC_COMMANDS_LITERAL.OR, expressions, this.fieldName);
  66. }
  67. }
  68. export function isLogicCommand(object) {
  69. return object && (object instanceof LogicCommand) && (object._internalType === SYMBOL_LOGIC_COMMAND);
  70. }
  71. export function isKnownLogicCommand(object) {
  72. return isLogicCommand && (object.operator.toUpperCase() in LOGIC_COMMANDS_LITERAL);
  73. }
  74. export default LogicCommand;