001/*
002 * (C) Copyright 2014 Nuxeo SAS (http://nuxeo.com/) and contributors.
003 *
004 * All rights reserved. This program and the accompanying materials
005 * are made available under the terms of the GNU Lesser General Public License
006 * (LGPL) version 2.1 which accompanies this distribution, and is available at
007 * http://www.gnu.org/licenses/lgpl-2.1.html
008 *
009 * This library is distributed in the hope that it will be useful,
010 * but WITHOUT ANY WARRANTY; without even the implied warranty of
011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012 * Lesser General Public License for more details.
013 *
014 * Contributors:
015 *     Benoit Delbosc
016 *
017 */
018
019package org.nuxeo.ecm.platform.query.core;
020
021import java.util.ArrayList;
022import java.util.HashMap;
023import java.util.List;
024import java.util.Map;
025
026import org.nuxeo.common.xmap.annotation.XNode;
027import org.nuxeo.common.xmap.annotation.XNodeList;
028import org.nuxeo.common.xmap.annotation.XObject;
029import org.nuxeo.ecm.platform.query.api.AggregateDefinition;
030import org.nuxeo.ecm.platform.query.api.AggregateRangeDateDefinition;
031import org.nuxeo.ecm.platform.query.api.AggregateRangeDefinition;
032import org.nuxeo.ecm.platform.query.api.PredicateFieldDefinition;
033
034/**
035 * @since 6.0
036 */
037@XObject(value = "aggregate")
038public class AggregateDescriptor implements AggregateDefinition {
039
040    @XNodeList(value = "dateRanges/dateRange", type = ArrayList.class, componentType = AggregateRangeDateDescriptor.class)
041    protected List<AggregateRangeDateDescriptor> aggregateDateRanges;
042
043    @XNode(value = "properties")
044    protected PropertiesDescriptor aggregateProperties = new PropertiesDescriptor();
045
046    protected Map<String, Integer> aggregateDateRangeDefinitionOrderMap;
047
048    private Map<String, Integer> aggregateRangeDefinitionOrderMap;
049
050    @XNodeList(value = "ranges/range", type = ArrayList.class, componentType = AggregateRangeDescriptor.class)
051    protected List<AggregateRangeDescriptor> aggregateRanges;
052
053    @XNode("field")
054    protected FieldDescriptor field;
055
056    @XNode("@id")
057    protected String id;
058
059    @XNode("@parameter")
060    protected String parameter;
061
062    @XNode("@type")
063    protected String type;
064
065    @Override
066    public AggregateDescriptor clone() {
067        AggregateDescriptor clone = new AggregateDescriptor();
068        clone.id = id;
069        clone.parameter = parameter;
070        clone.type = type;
071        if (field != null) {
072            clone.field = field.clone();
073        }
074        if (aggregateProperties != null) {
075            clone.aggregateProperties = new PropertiesDescriptor();
076            clone.aggregateProperties.properties.putAll(aggregateProperties.properties);
077        }
078        if (aggregateRanges != null) {
079            clone.aggregateRanges = new ArrayList<AggregateRangeDescriptor>(aggregateRanges.size());
080            clone.aggregateRanges.addAll(aggregateRanges);
081        }
082        if (aggregateDateRanges != null) {
083            clone.aggregateDateRanges = new ArrayList<AggregateRangeDateDescriptor>(aggregateDateRanges.size());
084            clone.aggregateDateRanges.addAll(aggregateDateRanges);
085        }
086        return clone;
087    }
088
089    @Override
090    public Map<String, Integer> getAggregateDateRangeDefinitionOrderMap() {
091        if (aggregateDateRangeDefinitionOrderMap == null) {
092            aggregateDateRangeDefinitionOrderMap = new HashMap<String, Integer>(getDateRanges().size());
093            for (int i = 0; i < getDateRanges().size(); i++) {
094                aggregateDateRangeDefinitionOrderMap.put(getDateRanges().get(i).getKey(), i);
095            }
096        }
097        return aggregateDateRangeDefinitionOrderMap;
098    }
099
100    @Override
101    public Map<String, Integer> getAggregateRangeDefinitionOrderMap() {
102        if (aggregateRangeDefinitionOrderMap == null) {
103            aggregateRangeDefinitionOrderMap = new HashMap<String, Integer>(getRanges().size());
104            for (int i = 0; i < getRanges().size(); i++) {
105                aggregateRangeDefinitionOrderMap.put(getRanges().get(i).getKey(), i);
106            }
107        }
108        return aggregateRangeDefinitionOrderMap;
109    }
110
111    @Override
112    public List<AggregateRangeDateDefinition> getDateRanges() {
113        @SuppressWarnings("unchecked")
114        List<AggregateRangeDateDefinition> ret = (List<AggregateRangeDateDefinition>) (List<?>) aggregateDateRanges;
115        return ret;
116    }
117
118    @Override
119    public String getDocumentField() {
120        return parameter;
121    }
122
123    @Override
124    public String getId() {
125        return id;
126    }
127
128    @Override
129    public Map<String, String> getProperties() {
130        return aggregateProperties.getProperties();
131    }
132
133    @Override
134    public List<AggregateRangeDefinition> getRanges() {
135        @SuppressWarnings("unchecked")
136        List<AggregateRangeDefinition> ret = (List<AggregateRangeDefinition>) (List<?>) aggregateRanges;
137        return ret;
138    }
139
140    @Override
141    public PredicateFieldDefinition getSearchField() {
142        return field;
143    }
144
145    @Override
146    public String getType() {
147        return type;
148    }
149
150    @Override
151    @SuppressWarnings("unchecked")
152    public void setDateRanges(List<AggregateRangeDateDefinition> ranges) {
153        aggregateDateRanges = (List<AggregateRangeDateDescriptor>) (List<?>) ranges;
154        aggregateDateRangeDefinitionOrderMap = null;
155    }
156
157    @Override
158    public void setDocumentField(String parameter) {
159        this.parameter = parameter;
160    }
161
162    @Override
163    public void setId(String id) {
164        this.id = id;
165    }
166
167    @Override
168    public void setProperty(String name, String value) {
169        aggregateProperties.properties.put(name, value);
170    }
171
172    @Override
173    @SuppressWarnings("unchecked")
174    public void setRanges(List<AggregateRangeDefinition> ranges) {
175        aggregateRanges = (List<AggregateRangeDescriptor>) (List<?>) ranges;
176        aggregateRangeDefinitionOrderMap = null;
177    }
178
179    @Override
180    public void setSearchField(PredicateFieldDefinition field) {
181        this.field = (FieldDescriptor) field;
182    }
183
184    @Override
185    public void setType(String type) {
186        this.type = type;
187    }
188
189}