package org.apache.lucene.facet.index.params;
import java.util.ArrayList;
import java.util.List;
import org.apache.lucene.facet.index.categorypolicy.DefaultOrdinalPolicy;
import org.apache.lucene.facet.index.categorypolicy.DefaultPathPolicy;
import org.apache.lucene.facet.index.categorypolicy.OrdinalPolicy;
import org.apache.lucene.facet.index.categorypolicy.PathPolicy;
import org.apache.lucene.facet.taxonomy.CategoryPath;
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.
*/
/**
* Default implementation for {@link FacetIndexingParams}.
* <p>
* Getters for <em>partition-size</em>, {@link OrdinalPolicy} and
* {@link PathPolicy} are all final, and so the proper way to modify them when
* extending this class is through {@link #fixedPartitionSize()},
* {@link #fixedOrdinalPolicy()} or {@link #fixedPathPolicy()} accordingly.
*
* @lucene.experimental
*/
public class DefaultFacetIndexingParams implements FacetIndexingParams {
/**
* delimiter between a categories in a path, e.g. Products FACET_DELIM
* Consumer FACET_DELIM Tv. This should be a character not found in any path
* component
*/
public static final char DEFAULT_FACET_DELIM_CHAR = '\uF749';
private final CategoryListParams clpParams;
private final OrdinalPolicy ordinalPolicy;
private final PathPolicy pathPolicy;
private final int partitionSize;
public DefaultFacetIndexingParams() {
this(new CategoryListParams());
}
public DefaultFacetIndexingParams(CategoryListParams categoryListParams) {
clpParams = categoryListParams;
ordinalPolicy = fixedOrdinalPolicy();
pathPolicy = fixedPathPolicy();
partitionSize = fixedPartitionSize();
}
public CategoryListParams getCategoryListParams(CategoryPath category) {
return clpParams;
}
public int drillDownTermText(CategoryPath path, char[] buffer) {
return path.copyToCharArray(buffer, 0, -1, getFacetDelimChar());
}
/**
* "fixed" partition size.
* @see #getPartitionSize()
*/
protected int fixedPartitionSize() {
return Integer.MAX_VALUE;
}
/**
* "fixed" ordinal policy.
* @see #getOrdinalPolicy()
*/
protected OrdinalPolicy fixedOrdinalPolicy() {
return new DefaultOrdinalPolicy();
}
/**
* "fixed" path policy.
* @see #getPathPolicy()
*/
protected PathPolicy fixedPathPolicy() {
return new DefaultPathPolicy();
}
public final int getPartitionSize() {
return partitionSize;
}
/*
* (non-Javadoc)
*
* @see
* org.apache.lucene.facet.index.params.FacetIndexingParams#getAllCategoryListParams
* ()
*/
public Iterable<CategoryListParams> getAllCategoryListParams() {
List<CategoryListParams> res = new ArrayList<CategoryListParams>();
res.add(clpParams);
return res;
}
public final OrdinalPolicy getOrdinalPolicy() {
return ordinalPolicy;
}
public final PathPolicy getPathPolicy() {
return pathPolicy;
}
/* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((clpParams == null) ? 0 : clpParams.hashCode());
result = prime * result
+ ((ordinalPolicy == null) ? 0 : ordinalPolicy.hashCode());
result = prime * result + partitionSize;
result = prime * result
+ ((pathPolicy == null) ? 0 : pathPolicy.hashCode());
for (CategoryListParams clp: getAllCategoryListParams()) {
result ^= clp.hashCode();
}
return result;
}
/* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (!(obj instanceof DefaultFacetIndexingParams)) {
return false;
}
DefaultFacetIndexingParams other = (DefaultFacetIndexingParams) obj;
if (clpParams == null) {
if (other.clpParams != null) {
return false;
}
} else if (!clpParams.equals(other.clpParams)) {
return false;
}
if (ordinalPolicy == null) {
if (other.ordinalPolicy != null) {
return false;
}
} else if (!ordinalPolicy.equals(other.ordinalPolicy)) {
return false;
}
if (partitionSize != other.partitionSize) {
return false;
}
if (pathPolicy == null) {
if (other.pathPolicy != null) {
return false;
}
} else if (!pathPolicy.equals(other.pathPolicy)) {
return false;
}
Iterable<CategoryListParams> cLs = getAllCategoryListParams();
Iterable<CategoryListParams> otherCLs = other.getAllCategoryListParams();
return cLs.equals(otherCLs);
}
/**
* Use {@link #DEFAULT_FACET_DELIM_CHAR} as the delimiter.
*/
public char getFacetDelimChar() {
return DEFAULT_FACET_DELIM_CHAR;
}
}