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}