All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.jaeksoft.searchlib.function.expression.GroupExpression Maven / Gradle / Ivy

Go to download

OpenSearchServer is a powerful, enterprise-class, search engine program. Using the web user interface, the crawlers (web, file, database, ...) and the REST/RESTFul API you will be able to integrate quickly and easily advanced full-text search capabilities in your application. OpenSearchServer runs on Windows and Linux/Unix/BSD.

The newest version!
/**   
 * License Agreement for OpenSearchServer
 *
 * Copyright (C) 2008 Emmanuel Keller / Jaeksoft
 * 
 * http://www.open-search-server.com
 * 
 * This file is part of OpenSearchServer.
 *
 * OpenSearchServer is free software: you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 * OpenSearchServer 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 General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with OpenSearchServer. 
 *  If not, see .
 **/

package com.jaeksoft.searchlib.function.expression;

import java.util.ArrayList;

import com.jaeksoft.searchlib.function.expression.operator.DivideExpression;
import com.jaeksoft.searchlib.function.expression.operator.MinusExpression;
import com.jaeksoft.searchlib.function.expression.operator.MultiplyExpression;
import com.jaeksoft.searchlib.function.expression.operator.OperatorExpression;
import com.jaeksoft.searchlib.function.expression.operator.PlusExpression;
import com.jaeksoft.searchlib.function.token.LetterOrDigitToken;

public class GroupExpression extends Expression {

	protected ArrayList expressions;

	protected GroupExpression(RootExpression root, char[] chars, int pos)
			throws SyntaxError {
		super(root);
		expressions = new ArrayList();
		while (pos < chars.length) {
			Expression exp = nextExpression(chars, pos);
			if (exp == null) {
				pos++;
				break;
			}
			expressions.add(exp);
			pos = exp.nextPos;
		}
		nextPos = pos;
	}

	private Expression nextExpression(char[] chars, int pos) throws SyntaxError {
		if (pos >= chars.length)
			return null;
		char ch = chars[pos];
		if (ch == '(')
			return new GroupExpression(root, chars, pos + 1);
		if (Character.isDigit(ch))
			return new FloatExpression(chars, pos);
		if (Character.isLetter(ch))
			return nextLetterExpression(chars, pos);
		if (ch == '+')
			return new PlusExpression(pos);
		if (ch == '*')
			return new MultiplyExpression(pos);
		if (ch == '/')
			return new DivideExpression(pos);
		if (ch == '-')
			return new MinusExpression(pos);
		if (ch == ')')
			return null;
		throw new SyntaxError("Syntax error", chars, pos);
	}

	private Expression nextLetterExpression(char[] chars, int pos)
			throws SyntaxError {
		LetterOrDigitToken token = new LetterOrDigitToken(chars, pos, null);
		if ("score".equalsIgnoreCase(token.word))
			return new ScoreExpression(root, pos);
		return new FunctionExpression(root, chars, pos);

	}

	@Override
	protected float getValue(float subQueryScore, float valSrcScore) {
		float value = 0;
		OperatorExpression operator = new PlusExpression(0);
		for (Expression expression : expressions) {
			if (expression instanceof OperatorExpression)
				operator = (OperatorExpression) expression;
			else {
				value = operator.newValue(value,
						expression.getValue(subQueryScore, valSrcScore));
			}
		}
		return value;
	}

	@Override
	protected float getValue(float subQueryScore, float[] valSrcScores) {
		float value = 0;
		OperatorExpression operator = new PlusExpression(0);
		for (Expression expression : expressions) {
			if (expression instanceof OperatorExpression)
				operator = (OperatorExpression) expression;
			else {
				value = operator.newValue(value,
						expression.getValue(subQueryScore, valSrcScores));
			}
		}
		return value;
	}

	@Override
	public String toString() {
		StringBuilder sb = new StringBuilder();
		sb.append('(');
		for (Expression expression : expressions)
			sb.append(expression.toString());
		sb.append(')');
		return sb.toString();
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy