001: /*
002: * $Id: MatchesFunction.java,v 1.9 2005/06/18 01:03:45 ahimanikya Exp $
003: * =======================================================================
004: * Copyright (c) 2002-2005 Axion Development Team. All rights reserved.
005: *
006: * Redistribution and use in source and binary forms, with or without
007: * modification, are permitted provided that the following conditions
008: * are met:
009: *
010: * 1. Redistributions of source code must retain the above
011: * copyright notice, this list of conditions and the following
012: * disclaimer.
013: *
014: * 2. Redistributions in binary form must reproduce the above copyright
015: * notice, this list of conditions and the following disclaimer in
016: * the documentation and/or other materials provided with the
017: * distribution.
018: *
019: * 3. The names "Tigris", "Axion", nor the names of its contributors may
020: * not be used to endorse or promote products derived from this
021: * software without specific prior written permission.
022: *
023: * 4. Products derived from this software may not be called "Axion", nor
024: * may "Tigris" or "Axion" appear in their names without specific prior
025: * written permission.
026: *
027: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
028: * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
029: * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
030: * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
031: * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
032: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
033: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
034: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
035: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
036: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
037: * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
038: * =======================================================================
039: */
040:
041: package org.axiondb.functions;
042:
043: import java.util.regex.Pattern;
044: import java.util.regex.PatternSyntaxException;
045:
046: import org.axiondb.AxionException;
047: import org.axiondb.DataType;
048: import org.axiondb.FunctionFactory;
049: import org.axiondb.RowDecorator;
050: import org.axiondb.Selectable;
051: import org.axiondb.types.BooleanType;
052: import org.axiondb.types.StringType;
053:
054: /**
055: * <tt>MATCHES(string, string)</tt>: returns a {@link BooleanTypeboolean} that
056: * indicates whether first string matches the regular expression {@link Pattern pattern}
057: * represented by the second string.
058: *
059: * @version $Revision: 1.9 $ $Date: 2005/06/18 01:03:45 $
060: * @author Chuck Burdick
061: * @author Jonathan Giron
062: */
063: public class MatchesFunction extends BaseRegExpFunction implements
064: ScalarFunction, FunctionFactory {
065: public MatchesFunction() {
066: super ("MATCHES");
067: }
068:
069: public ConcreteFunction makeNewInstance() {
070: return new MatchesFunction();
071: }
072:
073: public DataType getDataType() {
074: return RETURN_TYPE;
075: }
076:
077: public Object evaluate(RowDecorator row) throws AxionException {
078: String compare = getStringFromArg(getArgument(0), row);
079: String pattern = getStringFromArg(getArgument(1), row);
080:
081: // ISO/IEC 9075-2:2003, Section 8.6, General Rule 4(a): if either compare or pattern is null,
082: // result is unknown.
083: if (null == pattern || null == compare) {
084: return null;
085: }
086:
087: try {
088: Pattern regex = compile(pattern);
089: return regex.matcher(compare).find() ? Boolean.TRUE
090: : Boolean.FALSE;
091: } catch (PatternSyntaxException e) {
092: throw new AxionException(e, 2220102);
093: }
094: }
095:
096: private String getStringFromArg(Selectable sel, RowDecorator row)
097: throws AxionException {
098: return (String) ARG_TYPE.convert(sel.evaluate(row));
099: }
100:
101: public boolean isValid() {
102: return (getArgumentCount() == 2);
103: }
104:
105: protected static final DataType ARG_TYPE = new StringType();
106: protected static final DataType RETURN_TYPE = new BooleanType();
107: }
|