/**
* 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.
*/
package org.apache.jena.query.text ;
import java.util.Collection ;
import java.util.Collections ;
import java.util.HashMap ;
import java.util.Map ;
import org.apache.jena.ext.com.google.common.collect.ArrayListMultimap;
import org.apache.jena.ext.com.google.common.collect.ListMultimap;
import org.apache.jena.graph.Node ;
import org.apache.jena.rdf.model.Resource ;
import org.apache.lucene.analysis.Analyzer ;
/**
* Definition of a "document"
*/
public class EntityDefinition {
private final Map<Node, String> predicateToField = new HashMap<>() ;
private final Map<String, Analyzer> fieldToAnalyzer = new HashMap<>() ;
private final ListMultimap<String, Node> fieldToPredicate = ArrayListMultimap.create() ;
private final Collection<String> fields = Collections.unmodifiableCollection(fieldToPredicate.keys()) ;
// private final Collection<String> fields =
// Collections.unmodifiableCollection(fieldToPredicate.keySet()) ;
private final String entityField ;
private final String primaryField ;
private String graphField = null ;
private String langField ;
private String uidField ;
/**
* @param entityField
* The entity being indexed (e.g. it's URI).
* @param primaryField
* The primary/default field to search
*/
public EntityDefinition(String entityField, String primaryField) {
this.entityField = entityField ;
this.primaryField = primaryField ;
}
/**
* @param entityField
* The entity being indexed (e.g. it's URI).
* @param primaryField
* The primary/default field to search
* @param graphField
* The field that stores graph URI, or null
*/
public EntityDefinition(String entityField, String primaryField, String graphField) {
this(entityField, primaryField) ;
setGraphField(graphField);
}
/**
* @param entityField
* The entity being indexed (e.g. it's URI).
* @param primaryField
* The primary/default field to search
* @param primaryPredicate
* The property associated with the primary/default field
*/
public EntityDefinition(String entityField, String primaryField, Resource primaryPredicate) {
this(entityField, primaryField) ;
setPrimaryPredicate(primaryPredicate);
}
/**
* @param entityField
* The entity being indexed (e.g. it's URI).
* @param primaryField
* The primary/default field to search
* @param primaryPredicate
* The property associated with the primary/default field
*/
public EntityDefinition(String entityField, String primaryField, Node primaryPredicate) {
this(entityField, primaryField) ;
setPrimaryPredicate(primaryPredicate);
}
/**
* @param entityField
* The entity being indexed (e.g. it's URI).
* @param primaryField
* The primary/default field to search
* @param graphField
* The field that stores graph URI, or null
* @param primaryPredicate
* The property associated with the primary/default field
*/
public EntityDefinition(String entityField, String primaryField, String graphField, Node primaryPredicate) {
this(entityField, primaryField) ;
setGraphField(graphField);
setPrimaryPredicate(primaryPredicate) ;
}
public String getEntityField() {
return entityField ;
}
public void setPrimaryPredicate(Resource primaryPredicate) {
setPrimaryPredicate(primaryPredicate.asNode());
}
public void setPrimaryPredicate(Node primaryPredicate) {
set(primaryField, primaryPredicate) ;
}
public void set(String field, Node predicate) {
predicateToField.put(predicate, field) ;
// Add uniquely.
Collection<Node> c = fieldToPredicate.get(field) ;
if (c == null || !c.contains(predicate))
fieldToPredicate.put(field, predicate) ;
}
public Collection<Node> getPredicates(String field) {
return fieldToPredicate.get(field) ;
}
public String getField(Node predicate) {
return predicateToField.get(predicate) ;
}
public void setAnalyzer(String field, Analyzer analyzer) {
fieldToAnalyzer.put(field, analyzer);
}
public Analyzer getAnalyzer(String field) {
return fieldToAnalyzer.get(field);
}
public String getPrimaryField() {
return primaryField ;
}
public Node getPrimaryPredicate() {
Collection<Node> c = fieldToPredicate.get(getPrimaryField()) ;
return getOne(c) ;
}
public String getGraphField() {
return graphField ;
}
public void setGraphField(String graphField) {
this.graphField = graphField;
}
public String getLangField() {
return langField;
}
public void setLangField(String langField) {
this.langField = langField;
}
public String getUidField() {
return uidField;
}
public void setUidField(String uidField) {
this.uidField = uidField;
}
public Collection<String> fields() {
return fields ;
}
private static <T> T getOne(Collection<T> collection) {
if ( collection.size() != 1 )
return null ;
return collection.iterator().next() ;
}
@Override
public String toString() {
return entityField+":"+predicateToField ;
}
}