mirror of https://github.com/citusdata/citus.git
Skip adding equal attribute classes into a list
parent
0644e72539
commit
dc667a3db1
|
@ -81,6 +81,10 @@ static bool AttributeClassContainsAttributeClassMember(AttributeEquivalenceClass
|
||||||
static List * AddAttributeClassToAttributeClassList(List *attributeEquivalenceList,
|
static List * AddAttributeClassToAttributeClassList(List *attributeEquivalenceList,
|
||||||
AttributeEquivalenceClass *
|
AttributeEquivalenceClass *
|
||||||
attributeEquivalance);
|
attributeEquivalance);
|
||||||
|
static bool AttributeEquivalancesAreEqual(AttributeEquivalenceClass *
|
||||||
|
firstAttributeEquivalance,
|
||||||
|
AttributeEquivalenceClass *
|
||||||
|
secondAttributeEquivalance);
|
||||||
static AttributeEquivalenceClass * GenerateCommonEquivalence(List *
|
static AttributeEquivalenceClass * GenerateCommonEquivalence(List *
|
||||||
attributeEquivalenceList);
|
attributeEquivalenceList);
|
||||||
static void ListConcatUniqueAttributeClassMemberLists(AttributeEquivalenceClass **
|
static void ListConcatUniqueAttributeClassMemberLists(AttributeEquivalenceClass **
|
||||||
|
@ -763,26 +767,97 @@ AttributeClassContainsAttributeClassMember(AttributeEquivalenceClassMember *inpu
|
||||||
* Firstly, the function skips adding NULL attributeEquivalance to the list.
|
* Firstly, the function skips adding NULL attributeEquivalance to the list.
|
||||||
* Secondly, since an attribute equivalence class with a single member does
|
* Secondly, since an attribute equivalence class with a single member does
|
||||||
* not contribute to our purposes, we skip such classed adding to the list.
|
* not contribute to our purposes, we skip such classed adding to the list.
|
||||||
|
* Finally, we don't want to add an equivalence class whose exact equivalent
|
||||||
|
* already exists in the list.
|
||||||
*/
|
*/
|
||||||
static List *
|
static List *
|
||||||
AddAttributeClassToAttributeClassList(List *attributeEquivalenceList,
|
AddAttributeClassToAttributeClassList(List *attributeEquivalenceList,
|
||||||
AttributeEquivalenceClass *attributeEquivalance)
|
AttributeEquivalenceClass *attributeEquivalance)
|
||||||
{
|
{
|
||||||
List *equivalentAttributes = NULL;
|
List *equivalentAttributes = NULL;
|
||||||
|
ListCell *attributeEquivalanceCell = NULL;
|
||||||
|
|
||||||
if (attributeEquivalance == NULL)
|
if (attributeEquivalance == NULL)
|
||||||
{
|
{
|
||||||
return attributeEquivalenceList;
|
return attributeEquivalenceList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Note that in some cases we allow having equivalentAttributes with zero or
|
||||||
|
* one elements. For the details, see AddToAttributeEquivalenceClass().
|
||||||
|
*/
|
||||||
equivalentAttributes = attributeEquivalance->equivalentAttributes;
|
equivalentAttributes = attributeEquivalance->equivalentAttributes;
|
||||||
if (list_length(equivalentAttributes) < 2)
|
if (list_length(equivalentAttributes) < 2)
|
||||||
{
|
{
|
||||||
return attributeEquivalenceList;
|
return attributeEquivalenceList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* we don't want to add an attributeEquivalance which already exists */
|
||||||
|
foreach(attributeEquivalanceCell, attributeEquivalenceList)
|
||||||
|
{
|
||||||
|
AttributeEquivalenceClass *currentAttributeEquivalance =
|
||||||
|
(AttributeEquivalenceClass *) lfirst(attributeEquivalanceCell);
|
||||||
|
|
||||||
|
if (AttributeEquivalancesAreEqual(currentAttributeEquivalance,
|
||||||
|
attributeEquivalance))
|
||||||
|
{
|
||||||
|
return attributeEquivalenceList;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
attributeEquivalenceList = lappend(attributeEquivalenceList,
|
attributeEquivalenceList = lappend(attributeEquivalenceList,
|
||||||
attributeEquivalance);
|
attributeEquivalance);
|
||||||
|
|
||||||
return attributeEquivalenceList;
|
return attributeEquivalenceList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* AttributeEquivalancesAreEqual returns true if both input attribute equivalence
|
||||||
|
* classes contains exactly the same members.
|
||||||
|
*/
|
||||||
|
static bool
|
||||||
|
AttributeEquivalancesAreEqual(AttributeEquivalenceClass *firstAttributeEquivalance,
|
||||||
|
AttributeEquivalenceClass *secondAttributeEquivalance)
|
||||||
|
{
|
||||||
|
List *firstEquivalenceMemberList = firstAttributeEquivalance->equivalentAttributes;
|
||||||
|
List *secondEquivalenceMemberList = secondAttributeEquivalance->equivalentAttributes;
|
||||||
|
ListCell *firstAttributeEquivalanceCell = NULL;
|
||||||
|
ListCell *secondAttributeEquivalanceCell = NULL;
|
||||||
|
|
||||||
|
if (list_length(firstEquivalenceMemberList) != list_length(
|
||||||
|
secondEquivalenceMemberList))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
foreach(firstAttributeEquivalanceCell, firstEquivalenceMemberList)
|
||||||
|
{
|
||||||
|
AttributeEquivalenceClassMember *firstEqMember =
|
||||||
|
(AttributeEquivalenceClassMember *) lfirst(firstAttributeEquivalanceCell);
|
||||||
|
bool foundAnEquivalentMember = false;
|
||||||
|
|
||||||
|
foreach(secondAttributeEquivalanceCell, secondEquivalenceMemberList)
|
||||||
|
{
|
||||||
|
AttributeEquivalenceClassMember *secondEqMember =
|
||||||
|
(AttributeEquivalenceClassMember *) lfirst(
|
||||||
|
secondAttributeEquivalanceCell);
|
||||||
|
|
||||||
|
if (firstEqMember->rteIdentity == secondEqMember->rteIdentity &&
|
||||||
|
firstEqMember->varattno == secondEqMember->varattno)
|
||||||
|
{
|
||||||
|
foundAnEquivalentMember = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* we couldn't find an equivalent member */
|
||||||
|
if (!foundAnEquivalentMember)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue