/*
* Copyright 2016 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.kie.workbench.common.services.refactoring.backend.server.query.standard;
import java.util.Set;
import java.util.function.Predicate;
import org.apache.lucene.search.Query;
import org.drools.workbench.models.datamodel.util.PortablePreconditions;
import org.kie.workbench.common.services.refactoring.backend.server.query.builder.MultipleTermQueryBuilder;
import org.kie.workbench.common.services.refactoring.backend.server.query.builder.QueryBuilder;
import org.kie.workbench.common.services.refactoring.backend.server.query.builder.SingleTermQueryBuilder;
import org.kie.workbench.common.services.refactoring.model.index.terms.valueterms.ValueIndexTerm;
/**
*
*/
public abstract class AbstractFindQuery {
protected Query buildFromMultipleTerms(Set<ValueIndexTerm> terms) {
final QueryBuilder builder = new MultipleTermQueryBuilder();
for( ValueIndexTerm term : terms ) {
builder.addTerm(term);
}
return builder.build();
}
protected Query buildFromSingleTerm(Set<ValueIndexTerm> terms) {
return buildFromSingleTerm(terms.iterator().next());
}
protected Query buildFromSingleTerm(ValueIndexTerm term) {
final QueryBuilder builder = new SingleTermQueryBuilder(term);
return builder.build();
}
protected void checkNotNullAndNotEmpty(Set<ValueIndexTerm> terms) {
PortablePreconditions.checkNotNull( "terms", terms );
if( terms.isEmpty() ) {
throw new IllegalArgumentException("At least 1 term must be submitted when querying referenced resources");
}
}
public static interface NamedPredicate extends Predicate<ValueIndexTerm> {
public String getTermName();
}
/**
* Checks<ol>
* <li>Whether all terms are valid or not (see parameter <code>validTermTests</code>)</li>
* <li>Whether the number of terms being submitted is valid</li>
*
* @param queryTerms The terms being validated
* @param queryName The name of the query
* @param requiredTermNames An array of {@link String} where each non-null value indicates that the term is required
* @param validTermTests {@link Predicate}s to test the terms
*/
@SafeVarargs
protected final void checkInvalidAndRequiredTerms(
Set<ValueIndexTerm> queryTerms,
String queryName,
String [] requiredTermNames,
Predicate<ValueIndexTerm>... validTermTests) {
// check invalid
int found[] = new int[validTermTests.length];
TERMS: for( ValueIndexTerm term : queryTerms ) {
for( int i = 0; i < validTermTests.length; ++i ) {
if( validTermTests[i].test(term) ) {
found[i]++;
continue TERMS;
}
}
throw new IllegalArgumentException( "Index term '" + term.getTerm() + "' can not be used with the " + queryName );
}
// check size
if( queryTerms.size() > validTermTests.length ) {
throw new IllegalArgumentException( "More terms submitted [" + queryTerms.size() + "] than can be accepted [" + validTermTests.length + "]" );
}
// check duplicates
for( int i = 0; i < found.length; ++i ) {
if( found[i] > 1 ) {
throw new IllegalArgumentException( "Duplicate terms are not accepted by the " + queryName);
}
}
// check required
for( int i = 0; i < requiredTermNames.length; ++i ) {
if( requiredTermNames[i] != null && found[i] == 0 ) {
throw new IllegalArgumentException( "Expected '" + requiredTermNames[i] + "' term was not found.");
}
}
}
protected void checkTermsSize(int expected, Set<ValueIndexTerm> terms) {
if( terms.size() > expected ) {
throw new IllegalArgumentException( "Expected " + expected + " terms, not " + terms.size() + " terms." );
}
}
}