/** * Copyright (C) 2001-2017 by RapidMiner and the contributors * * Complete list of developers available at our web site: * * http://rapidminer.com * * This program is free software: you can redistribute it and/or modify it under the terms of the * GNU Affero General Public License as published by the Free Software Foundation, either version 3 * of the License, or (at your option) any later version. * * 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. See the GNU * Affero General Public License for more details. * * 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/. */ package com.rapidminer.example.set; import com.rapidminer.example.Attribute; import com.rapidminer.example.Example; import com.rapidminer.example.ExampleSet; import java.util.Iterator; import java.util.LinkedList; import java.util.List; /** * The condition is fulfilled if an attribute has a value equal to, not equal to, less than, ... a * given value. This filter can be constructed from several conditions of the class * {@link AttributeValueFilterSingleCondition} which must all be fulfilled. * * @author Ingo Mierswa */ public class AttributeValueFilter implements Condition { private static final long serialVersionUID = 6977275837081172924L; private static final int AND = 0; private static final int OR = 1; /** The list of all single conditions. */ private List<AttributeValueFilterSingleCondition> conditions = new LinkedList<AttributeValueFilterSingleCondition>(); private int combinationMode = AND; /** * Creates a new AttributeValueFilter. If attribute is not nominal, value must be a number. */ public AttributeValueFilter(Attribute attribute, int comparisonType, String value) { addCondition(attribute, comparisonType, value); } /** * Constructs an AttributeValueFilter for a given {@link ExampleSet} from a parameter string * * @param parameterString * Must be of the form attribute1 R1 value1 RR attribute2 R2 value2 RR ..., where Ri * is one out of =, != or <>, <, >, <=, and >= and all RR must be * either || for OR or && for AND. */ public AttributeValueFilter(ExampleSet exampleSet, String parameterString) { if ((parameterString == null) || (parameterString.length() == 0)) { throw new IllegalArgumentException("Parameter string must not be empty!"); } String[] splitted = parameterString.split("\\|\\|"); if (splitted.length > 1) { for (String condition : splitted) { condition = condition.trim(); addCondition(new AttributeValueFilterSingleCondition(exampleSet, condition)); } this.combinationMode = OR; } else { splitted = parameterString.split("\\&\\&"); if (splitted.length > 1) { for (String condition : splitted) { condition = condition.trim(); addCondition(new AttributeValueFilterSingleCondition(exampleSet, condition)); } this.combinationMode = AND; } else { addCondition(new AttributeValueFilterSingleCondition(exampleSet, parameterString)); this.combinationMode = AND; } } } private void addCondition(Attribute attribute, int comparisonType, String value) { addCondition(new AttributeValueFilterSingleCondition(attribute, comparisonType, value)); } private void addCondition(AttributeValueFilterSingleCondition condition) { conditions.add(condition); } /** * Since the condition cannot be altered after creation we can just return the condition object * itself. * * @deprecated Conditions should not be able to be changed dynamically and hence there is no * need for a copy */ @Override @Deprecated public Condition duplicate() { return this; } @Override public String toString() { return conditions.toString(); } /** Returns true if all conditions are fulfilled for the given example. */ @Override public boolean conditionOk(Example e) { Iterator<AttributeValueFilterSingleCondition> i = conditions.iterator(); while (i.hasNext()) { AttributeValueFilterSingleCondition condition = i.next(); if (combinationMode == AND) { if (!condition.conditionOk(e)) { return false; } } else { if (condition.conditionOk(e)) { return true; } } } if (combinationMode == AND) { return true; } else { return false; } } }