/*
* (C) Copyright 2014 Nuxeo SA (http://nuxeo.com/) and others.
*
* 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.
*
* Contributors:
* Benoit Delbosc
*
*/
package org.nuxeo.ecm.platform.query.core;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.nuxeo.common.xmap.annotation.XNode;
import org.nuxeo.common.xmap.annotation.XNodeList;
import org.nuxeo.common.xmap.annotation.XObject;
import org.nuxeo.ecm.platform.query.api.AggregateDefinition;
import org.nuxeo.ecm.platform.query.api.AggregateRangeDateDefinition;
import org.nuxeo.ecm.platform.query.api.AggregateRangeDefinition;
import org.nuxeo.ecm.platform.query.api.PredicateFieldDefinition;
/**
* @since 6.0
*/
@XObject(value = "aggregate")
public class AggregateDescriptor implements AggregateDefinition {
@XNodeList(value = "dateRanges/dateRange", type = ArrayList.class, componentType = AggregateRangeDateDescriptor.class)
protected List<AggregateRangeDateDescriptor> aggregateDateRanges;
@XNode(value = "properties")
protected PropertiesDescriptor aggregateProperties = new PropertiesDescriptor();
protected Map<String, Integer> aggregateDateRangeDefinitionOrderMap;
private Map<String, Integer> aggregateRangeDefinitionOrderMap;
@XNodeList(value = "ranges/range", type = ArrayList.class, componentType = AggregateRangeDescriptor.class)
protected List<AggregateRangeDescriptor> aggregateRanges;
@XNode("field")
protected FieldDescriptor field;
@XNode("@id")
protected String id;
@XNode("@parameter")
protected String parameter;
@XNode("@type")
protected String type;
@Override
public AggregateDescriptor clone() {
AggregateDescriptor clone = new AggregateDescriptor();
clone.id = id;
clone.parameter = parameter;
clone.type = type;
if (field != null) {
clone.field = field.clone();
}
if (aggregateProperties != null) {
clone.aggregateProperties = new PropertiesDescriptor();
clone.aggregateProperties.properties.putAll(aggregateProperties.properties);
}
if (aggregateRanges != null) {
clone.aggregateRanges = new ArrayList<AggregateRangeDescriptor>(aggregateRanges.size());
clone.aggregateRanges.addAll(aggregateRanges);
}
if (aggregateDateRanges != null) {
clone.aggregateDateRanges = new ArrayList<AggregateRangeDateDescriptor>(aggregateDateRanges.size());
clone.aggregateDateRanges.addAll(aggregateDateRanges);
}
return clone;
}
@Override
public Map<String, Integer> getAggregateDateRangeDefinitionOrderMap() {
if (aggregateDateRangeDefinitionOrderMap == null) {
aggregateDateRangeDefinitionOrderMap = new HashMap<String, Integer>(getDateRanges().size());
for (int i = 0; i < getDateRanges().size(); i++) {
aggregateDateRangeDefinitionOrderMap.put(getDateRanges().get(i).getKey(), i);
}
}
return aggregateDateRangeDefinitionOrderMap;
}
@Override
public Map<String, Integer> getAggregateRangeDefinitionOrderMap() {
if (aggregateRangeDefinitionOrderMap == null) {
aggregateRangeDefinitionOrderMap = new HashMap<String, Integer>(getRanges().size());
for (int i = 0; i < getRanges().size(); i++) {
aggregateRangeDefinitionOrderMap.put(getRanges().get(i).getKey(), i);
}
}
return aggregateRangeDefinitionOrderMap;
}
@Override
public List<AggregateRangeDateDefinition> getDateRanges() {
@SuppressWarnings("unchecked")
List<AggregateRangeDateDefinition> ret = (List<AggregateRangeDateDefinition>) (List<?>) aggregateDateRanges;
return ret;
}
@Override
public String getDocumentField() {
return parameter;
}
@Override
public String getId() {
return id;
}
@Override
public Map<String, String> getProperties() {
return aggregateProperties.getProperties();
}
@Override
public List<AggregateRangeDefinition> getRanges() {
@SuppressWarnings("unchecked")
List<AggregateRangeDefinition> ret = (List<AggregateRangeDefinition>) (List<?>) aggregateRanges;
return ret;
}
@Override
public PredicateFieldDefinition getSearchField() {
return field;
}
@Override
public String getType() {
return type;
}
@Override
@SuppressWarnings("unchecked")
public void setDateRanges(List<AggregateRangeDateDefinition> ranges) {
aggregateDateRanges = (List<AggregateRangeDateDescriptor>) (List<?>) ranges;
aggregateDateRangeDefinitionOrderMap = null;
}
@Override
public void setDocumentField(String parameter) {
this.parameter = parameter;
}
@Override
public void setId(String id) {
this.id = id;
}
@Override
public void setProperty(String name, String value) {
aggregateProperties.properties.put(name, value);
}
@Override
@SuppressWarnings("unchecked")
public void setRanges(List<AggregateRangeDefinition> ranges) {
aggregateRanges = (List<AggregateRangeDescriptor>) (List<?>) ranges;
aggregateRangeDefinitionOrderMap = null;
}
@Override
public void setSearchField(PredicateFieldDefinition field) {
this.field = (FieldDescriptor) field;
}
@Override
public void setType(String type) {
this.type = type;
}
}