| /* |
| * Copyright 2009-2010 by The Regents of the University of California |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * you may obtain a copy of the License from |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package edu.uci.ics.hyracks.algebricks.core.algebra.base; |
| |
| import java.util.LinkedList; |
| import java.util.List; |
| |
| public final class EquivalenceClass { |
| private List<LogicalVariable> members; |
| private ILogicalExpression constRepresentative; |
| private LogicalVariable variableRepresentative; |
| private boolean representativeIsConst; |
| |
| public EquivalenceClass(List<LogicalVariable> members, ILogicalExpression constRepresentative) { |
| this.members = members; |
| this.constRepresentative = constRepresentative; |
| representativeIsConst = true; |
| } |
| |
| public EquivalenceClass(List<LogicalVariable> members, LogicalVariable variableRepresentative) { |
| this.members = members; |
| this.variableRepresentative = variableRepresentative; |
| representativeIsConst = false; |
| } |
| |
| public boolean representativeIsConst() { |
| return representativeIsConst; |
| } |
| |
| public List<LogicalVariable> getMembers() { |
| return members; |
| } |
| |
| public boolean contains(LogicalVariable var) { |
| return members.contains(var); |
| } |
| |
| public ILogicalExpression getConstRepresentative() { |
| return constRepresentative; |
| } |
| |
| public LogicalVariable getVariableRepresentative() { |
| return variableRepresentative; |
| } |
| |
| public void setConstRepresentative(ILogicalExpression constRepresentative) { |
| this.constRepresentative = constRepresentative; |
| this.representativeIsConst = true; |
| } |
| |
| public void setVariableRepresentative(LogicalVariable variableRepresentative) { |
| this.variableRepresentative = variableRepresentative; |
| this.representativeIsConst = false; |
| } |
| |
| public void merge(EquivalenceClass ec2) { |
| members.addAll(ec2.getMembers()); |
| if (!representativeIsConst && ec2.representativeIsConst()) { |
| representativeIsConst = true; |
| constRepresentative = ec2.getConstRepresentative(); |
| } |
| } |
| |
| public void addMember(LogicalVariable v) { |
| members.add(v); |
| } |
| |
| public EquivalenceClass cloneEquivalenceClass() { |
| List<LogicalVariable> membersClone = new LinkedList<LogicalVariable>(); |
| membersClone.addAll(members); |
| EquivalenceClass ec; |
| if (representativeIsConst()) { |
| ec = new EquivalenceClass(membersClone, constRepresentative); |
| } else { |
| ec = new EquivalenceClass(membersClone, variableRepresentative); |
| } |
| return ec; |
| } |
| |
| @Override |
| public String toString() { |
| return "(<" + (representativeIsConst ? constRepresentative : variableRepresentative) + "> " + members + ")"; |
| } |
| |
| @Override |
| public boolean equals(Object obj) { |
| if (!(obj instanceof EquivalenceClass)) { |
| return false; |
| } else { |
| EquivalenceClass ec = (EquivalenceClass) obj; |
| if (!members.equals(ec.getMembers())) { |
| return false; |
| } |
| if (representativeIsConst) { |
| return ec.representativeIsConst() && (constRepresentative.equals(ec.getConstRepresentative())); |
| } else { |
| return !ec.representativeIsConst() && (variableRepresentative.equals(ec.getVariableRepresentative())); |
| } |
| } |
| } |
| } |