/* * Copyright 2014 Red Hat, Inc. and/or its affiliates. * * 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 at * * 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 org.dashbuilder.dataset.filter; import java.util.ArrayList; import java.util.List; /** * A logical expression based filter definition. */ public class LogicalExprFilter extends ColumnFilter { protected LogicalExprType logicalOperator = LogicalExprType.AND; protected List<ColumnFilter> logicalTerms = new ArrayList<ColumnFilter>(); public LogicalExprFilter() { } public LogicalExprFilter(String columnId, LogicalExprType operator, List<ColumnFilter> terms) { super(columnId); this.logicalOperator = operator; setLogicalTerms(terms); setColumnId(columnId); } public LogicalExprFilter(String columnId, LogicalExprType operator, ColumnFilter... terms) { super(columnId); this.logicalOperator = operator; setLogicalTerms(terms); setColumnId(columnId); } public void setColumnId(String columnId) { String oldColumnId = getColumnId(); super.setColumnId(columnId); // Ensure children column refs are synced with its parent. for (ColumnFilter childFunction : logicalTerms) { String childColumnId = childFunction.getColumnId(); if (childColumnId == null || childColumnId.equals(oldColumnId)) { childFunction.setColumnId(columnId); } } } public LogicalExprType getLogicalOperator() { return logicalOperator; } public void setLogicalOperator(LogicalExprType logicalOperator) { this.logicalOperator = logicalOperator; } public List<ColumnFilter> getLogicalTerms() { return logicalTerms; } public void setLogicalTerms(List<ColumnFilter> logicalTerms) { this.logicalTerms = logicalTerms; } public void addLogicalTerm(ColumnFilter logicalTerm) { // Functions with no column reference inherit the column from its parent String childColumnId = logicalTerm.getColumnId(); if (childColumnId == null) { logicalTerm.setColumnId(this.getColumnId()); } this.logicalTerms.add(logicalTerm); } public void setLogicalTerms(ColumnFilter... logicalTerms) { this.logicalTerms.clear(); for (ColumnFilter term : logicalTerms) { addLogicalTerm(term); } } public ColumnFilter cloneInstance() { LogicalExprFilter clone = new LogicalExprFilter(); clone.columnId = columnId; clone.logicalOperator = logicalOperator; for (ColumnFilter term : logicalTerms) { clone.logicalTerms.add(term.cloneInstance()); } return clone; } public boolean equals(Object obj) { try { LogicalExprFilter other = (LogicalExprFilter) obj; if (!super.equals(other)) return false; if (logicalOperator != null && !logicalOperator.equals(other.logicalOperator)) return false; if (logicalTerms.size() != other.logicalTerms.size()) return false; for (ColumnFilter fc : logicalTerms) { if (!other.logicalTerms.contains(fc)) { return false; } } return true; } catch (ClassCastException e) { return false; } } public String toString() { StringBuilder out = new StringBuilder(); out.append("("); for (int i=0; i<logicalTerms.size(); i++) { if (i > 0) out.append(" ").append(logicalOperator).append(" "); out.append(logicalTerms.get(i).toString()); } out.append(")"); return out.toString(); } }