/**
* Copyright 2014 Sunny Gleason and original author or authors
*
* 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 io.kazuki.v0.store.index;
import io.kazuki.v0.store.index.query.QueryOperator;
import io.kazuki.v0.store.index.query.QueryTerm;
import io.kazuki.v0.store.schema.model.Attribute;
import io.kazuki.v0.store.schema.model.IndexAttribute;
import io.kazuki.v0.store.schema.model.IndexDefinition;
import io.kazuki.v0.store.schema.model.Schema;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.google.common.base.Preconditions;
public class SecondaryIndexQueryValidation {
public static void validateQuery(String indexName, List<QueryTerm> query, Schema schema) {
Preconditions.checkNotNull(query, "query");
Preconditions.checkNotNull(schema, "schema");
IndexDefinition indexDef = schema.getIndex(indexName);
Preconditions.checkNotNull(indexDef, "index");
boolean containsFirst = false;
boolean allEquality = true;
Set<String> seenCols = new HashSet<String>();
String firstIndexCol = indexDef.getAttributeNames().get(0);
for (QueryTerm term : query) {
String attrName = term.getField();
Attribute existsSchema = schema.getAttribute(attrName);
if (existsSchema == null) {
throw new IllegalArgumentException("unknown schema attribute: " + attrName);
}
IndexAttribute existsIndex = indexDef.getIndexAttribute(attrName);
if (existsIndex == null) {
throw new IllegalArgumentException("unknown index attribute: " + attrName);
}
containsFirst = containsFirst || attrName.equals(firstIndexCol);
allEquality = allEquality && term.getOperator().equals(QueryOperator.EQ);
seenCols.add(attrName);
}
if (!containsFirst) {
throw new IllegalArgumentException("query must contain first index attribute: "
+ firstIndexCol);
}
if (indexDef.isUnique()) {
boolean containsAll = (seenCols.size() == indexDef.getIndexAttributeMap().size());
if (!containsAll) {
throw new IllegalArgumentException("unique index query must contain all index attributes");
}
if (!allEquality) {
throw new IllegalArgumentException("unique index query must use equality operator only");
}
}
}
}