nodesEqualFuncs.c 3.5 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/*
 * Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
 *
 * This program is free software: you can use, redistribute, and/or modify
 * it under the terms of the GNU Affero General Public License, version 3
 * or later ("AGPL"), as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */

16
#include "querynodes.h"
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34

#define COMPARE_SCALAR_FIELD(fldname) \
	do { \
		if (a->fldname != b->fldname) \
			return false; \
	} while (0)

#define COMPARE_STRING(a, b)	\
	(((a) != NULL && (b) != NULL) ? (strcmp(a, b) == 0) : (a) == (b))

#define COMPARE_STRING_FIELD(fldname) \
	do { \
		if (!COMPARE_STRING(a->fldname, b->fldname)) \
			return false; \
	} while (0)

#define COMPARE_NODE_FIELD(fldname) \
	do { \
35
		if (!nodesEqualNode(a->fldname, b->fldname)) \
36 37 38
			return false; \
	} while (0)

39
#define COMPARE_NODE_LIST_FIELD(fldname) \
40
	do { \
41
		if (!nodeNodeListEqual(a->fldname, b->fldname)) \
42 43 44
			return false; \
	} while (0)

45
static bool nodeNodeListEqual(const SNodeList* a, const SNodeList* b) {
46 47 48 49 50 51 52 53
  if (a == b) {
    return true;
  }

  if (NULL == a || NULL == b) {
    return false;
  }

54
  if (LIST_LENGTH(a) != LIST_LENGTH(b)) {
55 56 57
    return false;
  }

58 59 60
  SNode* na, *nb;
  FORBOTH(na, a, nb, b) {
    if (!nodesEqualNode(na, nb)) {
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
      return false;
    }
  }
  return true;
}

static bool columnNodeEqual(const SColumnNode* a, const SColumnNode* b) {
  COMPARE_STRING_FIELD(dbName);
  COMPARE_STRING_FIELD(tableName);
  COMPARE_STRING_FIELD(colName);
  return true;
}

static bool valueNodeEqual(const SValueNode* a, const SValueNode* b) {
  COMPARE_STRING_FIELD(literal);
  return true;
}

static bool operatorNodeEqual(const SOperatorNode* a, const SOperatorNode* b) {
  COMPARE_SCALAR_FIELD(opType);
  COMPARE_NODE_FIELD(pLeft);
  COMPARE_NODE_FIELD(pRight);
  return true;
}

static bool logicConditionNodeEqual(const SLogicConditionNode* a, const SLogicConditionNode* b) {
  COMPARE_SCALAR_FIELD(condType);
88
  COMPARE_NODE_LIST_FIELD(pParameterList);
89 90 91 92 93
  return true;
}

static bool functionNodeEqual(const SFunctionNode* a, const SFunctionNode* b) {
  COMPARE_SCALAR_FIELD(funcId);
94
  COMPARE_NODE_LIST_FIELD(pParameterList);
95 96 97
  return true;
}

X
Xiaoyu Wang 已提交
98
bool nodesEqualNode(const SNodeptr a, const SNodeptr b) {
99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
  if (a == b) {
    return true;
  }

  if (NULL == a || NULL == b) {
    return false;
  }

  if (nodeType(a) != nodeType(b)) {
    return false;
  }

  switch (nodeType(a)) {
    case QUERY_NODE_COLUMN:
      return columnNodeEqual((const SColumnNode*)a, (const SColumnNode*)b);
    case QUERY_NODE_VALUE:
      return valueNodeEqual((const SValueNode*)a, (const SValueNode*)b);
    case QUERY_NODE_OPERATOR:
      return operatorNodeEqual((const SOperatorNode*)a, (const SOperatorNode*)b);
    case QUERY_NODE_LOGIC_CONDITION:
      return logicConditionNodeEqual((const SLogicConditionNode*)a, (const SLogicConditionNode*)b);
    case QUERY_NODE_FUNCTION:
      return functionNodeEqual((const SFunctionNode*)a, (const SFunctionNode*)b);
    case QUERY_NODE_REAL_TABLE:
    case QUERY_NODE_TEMP_TABLE:
    case QUERY_NODE_JOIN_TABLE:
    case QUERY_NODE_GROUPING_SET:
    case QUERY_NODE_ORDER_BY_EXPR:
127
    case QUERY_NODE_LIMIT:
128 129 130 131 132 133 134
      return false; // todo
    default:
      break;
  }

  return false;
}