⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 liketoregexpfunction.java

📁 开源的axion的数据库代码
💻 JAVA
字号:
/* * $Id: LikeToRegexpFunction.java,v 1.3 2003/07/09 17:09:55 cburdick Exp $ * ======================================================================= * Copyright (c) 2002 Axion Development Team.  All rights reserved. *   * Redistribution and use in source and binary forms, with or without  * modification, are permitted provided that the following conditions  * are met: *  * 1. Redistributions of source code must retain the above  *    copyright notice, this list of conditions and the following  *    disclaimer.  *    * 2. Redistributions in binary form must reproduce the above copyright  *    notice, this list of conditions and the following disclaimer in  *    the documentation and/or other materials provided with the  *    distribution.  *    * 3. The names "Tigris", "Axion", nor the names of its contributors may  *    not be used to endorse or promote products derived from this  *    software without specific prior written permission.  *   * 4. Products derived from this software may not be called "Axion", nor  *    may "Tigris" or "Axion" appear in their names without specific prior *    written permission. *    * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ======================================================================= */package org.axiondb.functions;import java.util.HashMap;import java.util.Map;import org.axiondb.AxionException;import org.axiondb.DataType;import org.axiondb.FunctionFactory;import org.axiondb.RowDecorator;import org.axiondb.types.StringType;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;/** * @version $Revision: 1.3 $ $Date: 2003/07/09 17:09:55 $ * @author Chuck Burdick */public class LikeToRegexpFunction extends BaseFunction implements ScalarFunction, FunctionFactory {    private static final Log _log = LogFactory.getLog(LikeToRegexpFunction.class);    private static final DataType ARG_TYPE = new StringType();    private StringBuffer _buf = null;    private Map _convertCache = null;    public LikeToRegexpFunction() {        super("LIKE_TO_REGEXP");        _buf = new StringBuffer();        _convertCache = new HashMap();    }    public ConcreteFunction makeNewInstance() {        return new LikeToRegexpFunction();    }    public DataType getDataType() {        return ARG_TYPE;    }    public Object evaluate(RowDecorator row) throws AxionException {        Object arg = getArgument(0).evaluate(row);        String likePattern = null;        String result = null;        if (ARG_TYPE.accepts(arg)) {            likePattern = (String)ARG_TYPE.convert(arg);        } else {            throw new AxionException(                "Value " + arg + " cannot be converted to a StringType.");        }                result = (String)_convertCache.get(likePattern);        if (result == null) {            result = convertLike(likePattern);            _convertCache.put(likePattern, result);            if (_log.isDebugEnabled()) {                _log.debug("Converted " + likePattern + " to " + result);            }        }        return result;    }    protected String convertLike(String orig) {        _buf.setLength(0);        int cap = 2 * orig.length();        if (_buf.capacity() < cap) {            _buf.ensureCapacity(cap);        }        if (orig.charAt(0) != '%') {            _buf.append("^");        }        boolean escaped = false;        String repl = null;        for (int i = 0; i < orig.length(); i++) {            char next = orig.charAt(i);            switch (next) {            case '%':                repl = ".*";                break;            case '_':                repl = ".";                break;            case '?':                repl = "\\?";                break;            case '*':                repl = "\\*";                break;            case '.':                repl = "\\.";                break;            case '\\':                if (i == orig.length() -1) {                    break;                } else {                    escaped = true;                    continue;                }            default:                if (escaped) {                    _buf.append('\\');                }            }            if (repl == null || escaped) {                _buf.append(next);            } else {                _buf.append(repl);            }            repl = null;            escaped = false;        }        if (orig.length() < 2 || (orig.charAt(orig.length()-1) != '%' &&                                  orig.charAt(orig.length()-2) != '\\')) {            _buf.append("$");        }        return _buf.toString();    }    public boolean isValid() {        return (getArgumentCount() == 1);    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -