de.mirkosertic.desktopsearch.QueryTokenizer.java Source code

Java tutorial

Introduction

Here is the source code for de.mirkosertic.desktopsearch.QueryTokenizer.java

Source

/**
 * FreeDesktopSearch - A Search Engine for your Desktop
 * Copyright (C) 2013 Mirko Sertic
 *
 * This program 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.
 *
 * 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along with this program; if not, see
 * <http://www.gnu.org/licenses/>.
 */
package de.mirkosertic.desktopsearch;

import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class QueryTokenizer {

    private final List<String> requiredTerms;
    private final List<String> notRequiredTerms;

    QueryTokenizer(String aQuery) {

        requiredTerms = new ArrayList<>();
        notRequiredTerms = new ArrayList<>();

        boolean isFirstChar = true;
        boolean isNegated = false;
        StringBuilder theCurrentTerm = new StringBuilder();

        for (int i = 0; i < aQuery.length(); i++) {
            char theCurrentChar = Character.toLowerCase(aQuery.charAt(i));
            switch (theCurrentChar) {
            case '-': {
                if (isFirstChar) {
                    isFirstChar = false;
                    isNegated = true;
                } else {
                    theCurrentTerm.append(theCurrentChar);
                }
                break;
            }
            case '+':
                if (isFirstChar) {
                    isNegated = false;
                    isFirstChar = false;
                } else {
                    theCurrentTerm.append(theCurrentChar);
                }
                break;
            case ' ': {
                if (isValid(theCurrentTerm.toString())) {
                    if (isNegated) {
                        notRequiredTerms.add(theCurrentTerm.toString());
                    } else {
                        requiredTerms.add(theCurrentTerm.toString());
                    }
                }
                theCurrentTerm = new StringBuilder();
                isNegated = false;
                isFirstChar = true;
                break;
            }
            default: {
                theCurrentTerm.append(theCurrentChar);
                isFirstChar = false;
                break;
            }
            }
        }

        if (isValid(theCurrentTerm.toString())) {
            if (isNegated) {
                notRequiredTerms.add(theCurrentTerm.toString());
            } else {
                requiredTerms.add(theCurrentTerm.toString());
            }
        }
    }

    static boolean isValid(String aTerm) {
        return !StringUtils.isEmpty(aTerm) && !"*".equals(aTerm) && !"?".equals(aTerm);
    }

    public List<String> getRequiredTerms() {
        return Collections.unmodifiableList(requiredTerms);
    }

    public List<String> getNotRequiredTerms() {
        return Collections.unmodifiableList(notRequiredTerms);
    }
}