You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hawq.apache.org by od...@apache.org on 2016/10/05 18:29:24 UTC

[14/18] incubator-hawq git commit: HAWQ-1048. Changed logic to support more than one logical operator in list.

HAWQ-1048. Changed logic to support more than one logical operator in list.


Project: http://git-wip-us.apache.org/repos/asf/incubator-hawq/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-hawq/commit/d563ab5b
Tree: http://git-wip-us.apache.org/repos/asf/incubator-hawq/tree/d563ab5b
Diff: http://git-wip-us.apache.org/repos/asf/incubator-hawq/diff/d563ab5b

Branch: refs/heads/HAWQ-964
Commit: d563ab5b184b07b86406659ebe0abec7e4915d81
Parents: 9225016
Author: Oleksandr Diachenko <od...@pivotal.io>
Authored: Fri Sep 23 18:35:41 2016 -0700
Committer: Oleksandr Diachenko <od...@pivotal.io>
Committed: Fri Sep 23 18:35:41 2016 -0700

----------------------------------------------------------------------
 src/backend/access/external/pxffilters.c | 64 ++++++++++++++++++++++++---
 src/include/access/pxffilters.h          |  8 ++++
 2 files changed, 65 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/d563ab5b/src/backend/access/external/pxffilters.c
----------------------------------------------------------------------
diff --git a/src/backend/access/external/pxffilters.c b/src/backend/access/external/pxffilters.c
index e945062..af6d2ea 100644
--- a/src/backend/access/external/pxffilters.c
+++ b/src/backend/access/external/pxffilters.c
@@ -31,7 +31,7 @@
 #include "utils/guc.h"
 #include "utils/lsyscache.h"
 
-static List* pxf_make_expression_items_list(List *quals);
+static List* pxf_make_expression_items_list(List *quals, Node *parent);
 static void pxf_free_filter(PxfFilterDesc* filter);
 static char* pxf_serialize_filter_list(List *filters);
 static bool opexpr_to_pxffilter(OpExpr *expr, PxfFilterDesc *filter);
@@ -180,6 +180,28 @@ Oid pxf_supported_types[] =
 	TIMESTAMPOID
 };
 
+static void
+pxf_free_filter_list(List *expressionItems)
+{
+	ListCell		*lc 	= NULL;
+	ExpressionItem 	*expressionItem = NULL;
+	int previousLength;
+
+	while (list_length(expressionItems) > 0)
+	{
+		expressionItem = (ExpressionItem *) lfirst(list_head(expressionItems));
+		pfree(expressionItem);
+
+		/* to avoid freeing already freed items - delete all occurrences of current expression*/
+		previousLength = expressionItems->length + 1;
+		while (expressionItems != NULL && previousLength > expressionItems->length)
+		{
+			previousLength = expressionItems->length;
+			expressionItems = list_delete_ptr(expressionItems, expressionItem);
+		}
+	}
+}
+
 /*
  * pxf_make_expression_items_list
  *
@@ -189,12 +211,15 @@ Oid pxf_supported_types[] =
  *
  * Basically this function just transforms expression tree to Reversed Polish Notation list.
  *
+ *
  */
 static List *
-pxf_make_expression_items_list(List *quals)
+pxf_make_expression_items_list(List *quals, Node *parent)
 {
+	ExpressionItem *expressionItem = NULL;
 	List			*result = NIL;
 	ListCell		*lc = NULL;
+	ListCell		*ilc = NULL;
 	
 	if (list_length(quals) == 0)
 		return NIL;
@@ -203,20 +228,41 @@ pxf_make_expression_items_list(List *quals)
 	{
 		Node *node = (Node *) lfirst(lc);
 		NodeTag tag = nodeTag(node);
+		expressionItem = (ExpressionItem *) palloc0(sizeof(ExpressionItem));
+		expressionItem->node = node;
+		expressionItem->parent = parent;
+		expressionItem->processed = false;
 
 		switch (tag)
 		{
 			case T_OpExpr:
 			{
-				result = lappend(result, node);
+				result = lappend(result, expressionItem);
 				break;
 			}
 			case T_BoolExpr:
 			{
 				BoolExpr	*expr = (BoolExpr *) node;
-				List *inner_result = pxf_make_expression_items_list(expr->args);
+				List *inner_result = pxf_make_expression_items_list(expr->args, node);
 				result = list_concat(result, inner_result);
-				result = lappend(result, node);
+
+				int childNodesNum = 0;
+
+				/* Find number of child nodes on first level*/
+				foreach (ilc, inner_result)
+				{
+					ExpressionItem *ei = (ExpressionItem *) lfirst(ilc);
+					if (!ei->processed && ei->parent == node)
+					{
+						ei->processed = true;
+						childNodesNum++;
+					}
+				}
+
+				for (int i = 0; i < childNodesNum - 1; i++)
+				{
+					result = lappend(result, expressionItem);
+				}
 				break;
 			}
 			default:
@@ -289,7 +335,8 @@ pxf_serialize_filter_list(List *expressionItems)
 	 */
 	foreach (lc, expressionItems)
 	{
-		Node *node = (Node *) lfirst(lc);
+		ExpressionItem *expressionItem = (ExpressionItem *) lfirst(lc);
+		Node *node = expressionItem->node;
 		NodeTag tag = nodeTag(node);
 
 		switch (tag)
@@ -621,9 +668,12 @@ char *serializePxfFilterQuals(List *quals)
 	if (pxf_enable_filter_pushdown)
 	{
 
-		List *expressionItems = pxf_make_expression_items_list(quals);
+		List *expressionItems = pxf_make_expression_items_list(quals, NULL);
 		result  = pxf_serialize_filter_list(expressionItems);
+		pxf_free_filter_list(expressionItems);
 	}
+
+
 	elog(DEBUG2, "serializePxfFilterQuals: filter result: %s", (result == NULL) ? "null" : result);
 
 	return result;

http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/d563ab5b/src/include/access/pxffilters.h
----------------------------------------------------------------------
diff --git a/src/include/access/pxffilters.h b/src/include/access/pxffilters.h
index a1cd661..894337b 100644
--- a/src/include/access/pxffilters.h
+++ b/src/include/access/pxffilters.h
@@ -92,6 +92,14 @@ typedef struct dbop_pxfop_map
 
 } dbop_pxfop_map;
 
+
+typedef struct ExpressionItem
+{
+	Node	*node;
+	Node	*parent;
+	bool	processed;
+} ExpressionItem;
+
 static inline bool pxfoperand_is_attr(PxfOperand x)
 {
 	return (x.opcode == PXF_ATTR_CODE);