/* Copyright 2013 Fabian Steeg, hbz. Licensed under the Eclipse Public License 1.0 */
package models.queries;
import static org.elasticsearch.index.query.QueryBuilders.hasChildQuery;
import static org.elasticsearch.index.query.QueryBuilders.matchQuery;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.MatchQueryBuilder.Operator;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import com.google.api.client.util.escape.PercentEscaper;
/**
* Queries on the lobid-items index.
*
* @author Fabian Steeg (fsteeg)
*/
public class LobidItems {
/**
* Query against all fields.
*/
public static class AllFieldsQuery extends AbstractIndexQuery {
@Override
public List<String> fields() {
final List<String> searchFields = new ArrayList<>(Arrays.asList("_all"));
final List<String> suggestFields = new NameQuery().fields();
searchFields.addAll(suggestFields);
return searchFields;
}
@Override
public QueryBuilder build(final String queryString) {
return QueryBuilders.queryString(queryString).field(fields().get(0));
}
}
/**
* Query the lobid-items index using an item ID.
*/
public static class IdQuery extends AbstractIndexQuery {
@Override
public List<String> fields() {
return Arrays.asList("internal_id");
}
PercentEscaper percentEscaper =
new PercentEscaper(PercentEscaper.SAFEPATHCHARS_URLENCODER, false);
@Override
public QueryBuilder build(final String queryString) {
final String itemPrefix = "http://lobid.org/item/";
final String shortId = queryString.replace(itemPrefix, "");
// The Lobid item IDs contain escaped url fragments
return QueryBuilders.matchPhraseQuery(fields().get(0),
itemPrefix + percentEscaper.escape(shortId));
}
}
/**
* Query the lobid-items index using an item name.
*/
public static class NameQuery extends AbstractIndexQuery {
@Override
public List<String> fields() {
return Arrays.asList("@graph.http://purl.org/ontology/daia/label.@value");
}
@Override
public QueryBuilder build(final String queryString) {
return matchQuery(fields().get(0), queryString).operator(Operator.AND);
}
}
/**
* Query lobid items by owner, return their parents (which are resources).
*/
public static class OwnerQuery extends AbstractIndexQuery {
@Override
public List<String> fields() {
return Arrays.asList("@graph.http://purl.org/vocab/frbr/core#owner.@id");
}
@Override
public QueryBuilder build(final String queryString) {
final String queryValues = withoutBooleanOperator(queryString);
boolean isAndQuery = isAndQuery(queryString);
final String[] owners = queryValues.split(",");
final String prefix = "http://lobid.org/organisation/";
BoolQueryBuilder itemQuery = QueryBuilders.boolQuery();
for (String owner : owners) {
final String ownerId = prefix + owner.replace(prefix, "");
if (isAndQuery) {
itemQuery = itemQuery.must(hasChildQuery("json-ld-lobid-item",
matchQuery(fields().get(0), ownerId)));
} else {
itemQuery = itemQuery.should(matchQuery(fields().get(0), ownerId));
}
}
return isAndQuery ? itemQuery
: hasChildQuery("json-ld-lobid-item", itemQuery);
}
}
}