// ============================================================================ // // Copyright (C) 2006-2016 Talend Inc. - www.talend.com // // This source code is available under agreement available at // %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt // // You should have received a copy of the agreement // along with this program; if not, write to Talend SA // 9 rue Pages 92150 Suresnes, France // // ============================================================================ package test.udi; import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; import org.talend.dataquality.domain.Domain; import org.talend.dataquality.domain.JavaUDIIndicatorParameter; import org.talend.dataquality.indicators.sql.impl.UserDefIndicatorImpl; /** * @author sizhaoliu * * Java implementation of a user defined indicator who returns matching and unmatching count of defined regex * pattern(s). * * This example also shows how to retrieve parameters from user interface of the indicator. * * User can setup one or more "pattern"s in the indicator page or the analyze page. When there are several patterns, the * data is matched if it matches with all the patterns. */ public class MyOrRegexIndicator extends UserDefIndicatorImpl { List<Pattern> patternList = new ArrayList<Pattern>(); @Override public boolean prepare() { String paramValue; Pattern pattern; if (parameters != null) { final Domain dataValidDomain = parameters.getIndicatorValidDomain(); if (dataValidDomain != null) { patternList.clear(); for (JavaUDIIndicatorParameter param : dataValidDomain.getJavaUDIIndicatorParameter()) { if (param != null) { if (param.getKey().startsWith("pattern")) { paramValue = param.getValue(); pattern = Pattern.compile(paramValue); patternList.add(pattern); } } } } } return super.prepare(); } @Override public boolean reset() { super.reset(); // reset count and nullCount values matchingValueCount = 0L; notMatchingValueCount = NOT_MATCHING_VALUE_COUNT_EDEFAULT; return true; } @Override public boolean handle(Object data) { // Check null value and increment count super.handle(data); if (data != null) { for (Pattern p : patternList) { if (p.matcher(data.toString()).matches()) { matchingValueCount++; return true; } } } return true; } @Override public boolean finalizeComputation() { // compute non matching value notMatchingValueCount = count - matchingValueCount; // set userCount value so that user can select "User Defined Count" as indicator type too. userCount = matchingValueCount; return true; } }