package services; import helpers.JsonLdConstants; import models.Record; import models.Resource; import org.apache.commons.lang3.StringUtils; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.aggregations.AggregationBuilder; import org.elasticsearch.search.aggregations.AggregationBuilders; import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramInterval; import org.elasticsearch.search.aggregations.bucket.histogram.Histogram; import org.elasticsearch.search.sort.SortOrder; import java.util.Arrays; import java.util.List; /** * @author fo */ public class AggregationProvider { public static AggregationBuilder<?> getTypeAggregation(int aSize) { return AggregationBuilders.terms("about.@type").size(aSize).field("about.@type").minDocCount(0) .exclude("Concept|ConceptScheme|Comment"); } public static AggregationBuilder<?> getLocationAggregation(int aSize) { return AggregationBuilders.terms("about.location.address.addressCountry").size(aSize) .field("about.location.address.addressCountry"); } public static AggregationBuilder<?> getServiceLanguageAggregation(int aSize) { return AggregationBuilders.terms("about.availableChannel.availableLanguage").size(aSize) .field("about.availableChannel.availableLanguage"); } public static AggregationBuilder<?> getServiceByFieldOfEducationAggregation(int aSize) { return AggregationBuilders.terms("about.about.@id").size(aSize).field("about.about.@id"); } public static AggregationBuilder<?> getServiceByFieldOfEducationAggregation(List<String> anIdList, int aSize) { return AggregationBuilders.terms("about.about.@id").size(aSize) .field("about.about.@id") .include(StringUtils.join(anIdList, '|')); } public static AggregationBuilder<?> getServiceByTopLevelFieldOfEducationAggregation() { String[] topLevelIds = new String[] { "https://w3id.org/class/esc/n00", "https://w3id.org/class/esc/n01", "https://w3id.org/class/esc/n02", "https://w3id.org/class/esc/n03", "https://w3id.org/class/esc/n04", "https://w3id.org/class/esc/n05", "https://w3id.org/class/esc/n06", "https://w3id.org/class/esc/n07", "https://w3id.org/class/esc/n08", "https://w3id.org/class/esc/n09", "https://w3id.org/class/esc/n10" }; return getServiceByFieldOfEducationAggregation(Arrays.asList(topLevelIds), 0); } public static AggregationBuilder<?> getServiceByGradeLevelAggregation(int aSize) { return AggregationBuilders.terms("about.audience.@id").size(aSize) .field("about.audience.@id"); } public static AggregationBuilder<?> getKeywordsAggregation(int aSize) { return AggregationBuilders.terms("about.keywords").size(aSize) .field("about.keywords"); } public static AggregationBuilder<?> getServiceByGradeLevelAggregation(List<String> anIdList, int aSize) { return AggregationBuilders.terms("about.audience.@id").size(aSize) .field("about.audience.@id") .include(StringUtils.join(anIdList, '|')); } public static AggregationBuilder<?> getByCountryAggregation(int aSize) { return AggregationBuilders .terms("about.location.address.addressCountry").field("about.location.address.addressCountry").size(aSize) .subAggregation(AggregationBuilders.terms("by_type").field("about.@type")) .subAggregation(AggregationBuilders .filter("champions") .filter(QueryBuilders.existsQuery(Record.RESOURCE_KEY + ".countryChampionFor"))); } public static AggregationBuilder<?> getForCountryAggregation(String aId, int aSize) { return AggregationBuilders .terms("about.location.address.addressCountry").field("about.location.address.addressCountry").include(aId) .size(aSize) .subAggregation(AggregationBuilders.terms("by_type").field("about.@type")) .subAggregation(AggregationBuilders .filter("champions") .filter(QueryBuilders.existsQuery(Record.RESOURCE_KEY + ".countryChampionFor"))); } public static AggregationBuilder<?> getNestedConceptAggregation(Resource aConcept, String aField) { String id = aConcept.getAsString(JsonLdConstants.ID); AggregationBuilder conceptAggregation = AggregationBuilders.filter(id).filter( QueryBuilders.termQuery(aField, id) ); for (Resource aNarrowerConcept : aConcept.getAsList("narrower")) { conceptAggregation.subAggregation(getNestedConceptAggregation(aNarrowerConcept, aField)); } return conceptAggregation; } public static AggregationBuilder<?> getLicenseAggregation(int aSize) { return AggregationBuilders.terms("about.license.@id").size(aSize) .field("about.license.@id"); } public static AggregationBuilder<?> getProjectByLocationAggregation(int aSize) { return AggregationBuilders.terms("about.agent.location.address.addressCountry").size(aSize) .field("about.agent.location.address.addressCountry"); } public static AggregationBuilder<?> getFunderAggregation(int aSize) { return AggregationBuilders.terms("about.isFundedBy.isAwardedBy.@id").size(aSize) .field("about.isFundedBy.isAwardedBy.@id"); } public static AggregationBuilder<?> getEventCalendarAggregation() { return AggregationBuilders .dateHistogram("about.startDate.GTE") .field("about.startDate") .interval(DateHistogramInterval.MONTH).subAggregation(AggregationBuilders.topHits("about.@id") .setFetchSource(new String[]{"about.@id", "about.@type", "about.name", "about.startDate", "about.endDate", "about.location"}, null) .addSort("about.startDate", SortOrder.ASC).setSize(Integer.MAX_VALUE) ).order(Histogram.Order.KEY_DESC); } }