Revision: 5877 http://sourceforge.net/p/jump-pilot/code/5877 Author: michaudm Date: 2018-06-14 11:42:36 +0000 (Thu, 14 Jun 2018) Log Message: ----------- Protect mean calculation against DivideByZero, add reset method to aggregators
Modified Paths: -------------- core/trunk/src/org/openjump/core/ui/plugin/tools/aggregate/AbstractAggregator.java core/trunk/src/org/openjump/core/ui/plugin/tools/aggregate/Aggregator.java core/trunk/src/org/openjump/core/ui/plugin/tools/aggregate/Aggregators.java Modified: core/trunk/src/org/openjump/core/ui/plugin/tools/aggregate/AbstractAggregator.java =================================================================== --- core/trunk/src/org/openjump/core/ui/plugin/tools/aggregate/AbstractAggregator.java 2018-06-12 06:25:45 UTC (rev 5876) +++ core/trunk/src/org/openjump/core/ui/plugin/tools/aggregate/AbstractAggregator.java 2018-06-14 11:42:36 UTC (rev 5877) @@ -31,10 +31,12 @@ values = new ArrayList<>(); } + @Override public Set<String> getParameters() { return parameters == null ? new HashSet<String>() : parameters.keySet(); } + @Override public void setParameter(String name, Object value) { if (parameters == null) { parameters = new LinkedHashMap<>(); @@ -42,23 +44,28 @@ parameters.put(name, value); } + @Override public Object getParameter(String name) { return parameters == null ? null : parameters.get(name); } + @Override public String getName() { String simpleName = getClass().getSimpleName(); return I18N.get(Aggregator.class.getName() + "." + simpleName.substring(simpleName.indexOf('$')+1)); } + @Override public boolean ignoreNull() { return ignoreNull; } + @Override public void setIgnoreNull(boolean ignoreNull) { this.ignoreNull = ignoreNull; } + @Override public void addValue(T object) { if (object != null || !ignoreNull) { values.add(object); @@ -65,18 +72,30 @@ } } + @Override public List<T> getValues() { return values; } + @Override public AttributeType getOutputAttributeType() { return outputType; } + @Override public abstract Object getResult(); + @Override + public void reset() { + if (values != null) { + values.clear(); + } + } + + @Override public abstract Aggregator clone(); + @Override public String toString() { return getName(); } Modified: core/trunk/src/org/openjump/core/ui/plugin/tools/aggregate/Aggregator.java =================================================================== --- core/trunk/src/org/openjump/core/ui/plugin/tools/aggregate/Aggregator.java 2018-06-12 06:25:45 UTC (rev 5876) +++ core/trunk/src/org/openjump/core/ui/plugin/tools/aggregate/Aggregator.java 2018-06-14 11:42:36 UTC (rev 5877) @@ -73,4 +73,9 @@ */ Object getResult(); + /** + * Reset the aggregator (clear the list of values) + */ + void reset(); + } Modified: core/trunk/src/org/openjump/core/ui/plugin/tools/aggregate/Aggregators.java =================================================================== --- core/trunk/src/org/openjump/core/ui/plugin/tools/aggregate/Aggregators.java 2018-06-12 06:25:45 UTC (rev 5876) +++ core/trunk/src/org/openjump/core/ui/plugin/tools/aggregate/Aggregators.java 2018-06-14 11:42:36 UTC (rev 5877) @@ -97,10 +97,12 @@ public Count(boolean ignoreNull) { super(AttributeType.INTEGER, ignoreNull); } - public Count clone() { + + @Override public Count clone() { return new Count(ignoreNull()); } - public Integer getResult() { + + @Override public Integer getResult() { return getValues().size(); } } @@ -110,12 +112,12 @@ super(AttributeType.STRING, ignoreNull); setParameter(Aggregator.SEPARATOR_NAME, ","); } - public Concatenate clone() { + @Override public Concatenate clone() { Concatenate concatenate = new Concatenate(ignoreNull()); concatenate.setParameter(Aggregator.SEPARATOR_NAME, this.getParameter(Aggregator.SEPARATOR_NAME)); return concatenate; } - public String getResult() { + @Override public String getResult() { StringBuilder sb = new StringBuilder(); for (int i = 0 ; i < getValues().size() ; i++) { String v = getValues().get(i) == null ? "<NULL>" : getValues().get(i).toString(); @@ -131,12 +133,12 @@ super(AttributeType.STRING, ignoreNull); setParameter(Aggregator.SEPARATOR_NAME, ","); } - public ConcatenateUnique clone() { + @Override public ConcatenateUnique clone() { ConcatenateUnique concatenate = new ConcatenateUnique(ignoreNull()); concatenate.setParameter(Aggregator.SEPARATOR_NAME, this.getParameter(Aggregator.SEPARATOR_NAME)); return concatenate; } - public String getResult() { + @Override public String getResult() { StringBuilder sb = new StringBuilder(); List<Object> values = getValues(); for (int i = 0 ; i < values.size() ; i++) { @@ -155,10 +157,10 @@ public Collect() { super(AttributeType.GEOMETRY, true); } - public Collect clone() { + @Override public Collect clone() { return new Collect(); } - public Geometry getResult() { + @Override public Geometry getResult() { return new GeometryFactory().buildGeometry(getValues()); } } @@ -167,10 +169,10 @@ public Union() { super(AttributeType.GEOMETRY, true); } - public Union clone() { + @Override public Union clone() { return new Union(); } - public Geometry getResult() { + @Override public Geometry getResult() { GeometryFactory gf = getValues().size() == 0 ? new GeometryFactory() : getValues().get(0).getFactory(); Geometry collected = gf.buildGeometry(getValues()); if (getValues().size() == 0) return collected; @@ -210,10 +212,10 @@ public IntSum() { super(AttributeType.INTEGER, true); } - public IntSum clone() { + @Override public IntSum clone() { return new IntSum(); } - public Integer getResult() { + @Override public Integer getResult() { int sum = 0; for (Integer value : getValues()) { if (value != null) { @@ -228,10 +230,10 @@ public LongSum() { super(AttributeType.LONG, true); } - public LongSum clone() { + @Override public LongSum clone() { return new LongSum(); } - public Long getResult() { + @Override public Long getResult() { long sum = 0; for (Number value : getValues()) { if (value != null) { @@ -246,10 +248,10 @@ public DoubleSum() { super(AttributeType.DOUBLE, true); } - public DoubleSum clone() { + @Override public DoubleSum clone() { return new DoubleSum(); } - public Double getResult() { + @Override public Double getResult() { double sum = 0; for (Number value : getValues()) { if (value != null) { @@ -264,10 +266,10 @@ public IntMin() { super(AttributeType.INTEGER, true); } - public IntMin clone() { + @Override public IntMin clone() { return new IntMin(); } - public Integer getResult() { + @Override public Integer getResult() { Integer min = null; for (Integer value : getValues()) { if (min == null || (value != null && value < min)) { @@ -282,10 +284,10 @@ public LongMin() { super(AttributeType.LONG, true); } - public LongMin clone() { + @Override public LongMin clone() { return new LongMin(); } - public Long getResult() { + @Override public Long getResult() { Long min = null; for (Long value : getValues()) { if (min == null || (value != null && value < min)) { @@ -300,10 +302,10 @@ public DoubleMin() { super(AttributeType.DOUBLE, true); } - public DoubleMin clone() { + @Override public DoubleMin clone() { return new DoubleMin(); } - public Double getResult() { + @Override public Double getResult() { Double min = null; for (Double value : getValues()) { if (min == null || (value != null && value < min)) { @@ -318,10 +320,10 @@ public StringMin() { super(AttributeType.STRING, true); } - public StringMin clone() { + @Override public StringMin clone() { return new StringMin(); } - public String getResult() { + @Override public String getResult() { String min = null; for (String value : getValues()) { if (min == null || (value != null && value.compareToIgnoreCase(min) < 0)) { @@ -336,10 +338,10 @@ public DateMin() { super(AttributeType.DATE, true); } - public DateMin clone() { + @Override public DateMin clone() { return new DateMin(); } - public Date getResult() { + @Override public Date getResult() { Date min = null; for (Date value : getValues()) { if (min == null || (value != null && value.before(min))) { @@ -354,10 +356,10 @@ public IntMax() { super(AttributeType.INTEGER, true); } - public IntMax clone() { + @Override public IntMax clone() { return new IntMax(); } - public Integer getResult() { + @Override public Integer getResult() { Integer max = null; for (Integer value : getValues()) { if (max == null || (value != null && value > max)) { @@ -372,10 +374,10 @@ public LongMax() { super(AttributeType.LONG, true); } - public LongMax clone() { + @Override public LongMax clone() { return new LongMax(); } - public Long getResult() { + @Override public Long getResult() { Long max = null; for (Long value : getValues()) { if (max == null || (value != null && value > max)) { @@ -390,10 +392,10 @@ public DoubleMax() { super(AttributeType.DOUBLE, true); } - public DoubleMax clone() { + @Override public DoubleMax clone() { return new DoubleMax(); } - public Double getResult() { + @Override public Double getResult() { Double max = null; for (Double value : getValues()) { if (max == null || (value != null && value > max)) { @@ -408,10 +410,10 @@ public StringMax() { super(AttributeType.STRING, true); } - public StringMax clone() { + @Override public StringMax clone() { return new StringMax(); } - public String getResult() { + @Override public String getResult() { String max = null; for (String value : getValues()) { if (max == null || (value != null && value.compareToIgnoreCase(max) > 0)) { @@ -426,10 +428,10 @@ public DateMax() { super(AttributeType.DATE, true); } - public DateMax clone() { + @Override public DateMax clone() { return new DateMax(); } - public Date getResult() { + @Override public Date getResult() { Date max = null; for (Date value : getValues()) { if (max == null || (value != null && value.after(max))) { @@ -444,14 +446,15 @@ public IntMean(boolean ignoreNull) { super(AttributeType.INTEGER, ignoreNull); } - public IntMean clone() { + @Override public IntMean clone() { return new IntMean(ignoreNull()); } - public Integer getResult() { + @Override public Integer getResult() { long sum = 0; for (Integer value : getValues()) { if (value != null) sum += value; } + if (getValues().size()==0) return null; return (int)(sum/getValues().size()); } } @@ -460,14 +463,15 @@ public LongMean(boolean ignoreNull) { super(AttributeType.LONG, ignoreNull); } - public LongMean clone() { + @Override public LongMean clone() { return new LongMean(ignoreNull()); } - public Long getResult() { + @Override public Long getResult() { long sum = 0; for (Long value : getValues()) { if (value != null) sum += value; } + if (getValues().size()==0) return null; return sum/getValues().size(); } } @@ -476,14 +480,15 @@ public DoubleMean(boolean ignoreNull) { super(AttributeType.DOUBLE, ignoreNull); } - public DoubleMean clone() { + @Override public DoubleMean clone() { return new DoubleMean(ignoreNull()); } - public Double getResult() { + @Override public Double getResult() { double sum = 0; for (Double value : getValues()) { if (value != null) sum += value; } + if (getValues().size()==0) return null; return sum/getValues().size(); } } @@ -493,14 +498,15 @@ public DateMean(boolean ignoreNull) { super(AttributeType.DATE, ignoreNull); } - public DateMean clone() { + @Override public DateMean clone() { return new DateMean(ignoreNull()); } - public Date getResult() { + @Override public Date getResult() { long sum = 0; for (Date value : getValues()) { if (value != null) sum += value.getTime(); } + if (getValues().size()==0) return null; return new Date(sum/getValues().size()); } } @@ -509,10 +515,10 @@ public IntMedian() { super(AttributeType.INTEGER, true); } - public IntMedian clone() { + @Override public IntMedian clone() { return new IntMedian(); } - public Integer getResult() { + @Override public Integer getResult() { List<Integer> sortedList = new ArrayList<Integer>(getValues()); if (sortedList.size() == 0) return null; Collections.sort(sortedList); @@ -524,10 +530,10 @@ public LongMedian() { super(AttributeType.LONG, true); } - public LongMedian clone() { + @Override public LongMedian clone() { return new LongMedian(); } - public Long getResult() { + @Override public Long getResult() { List<Long> sortedList = new ArrayList<Long>(getValues()); if (sortedList.size() == 0) return null; Collections.sort(sortedList); @@ -539,10 +545,10 @@ public DoubleMedian() { super(AttributeType.DOUBLE, true); } - public DoubleMedian clone() { + @Override public DoubleMedian clone() { return new DoubleMedian(); } - public Double getResult() { + @Override public Double getResult() { List<Double> sortedList = new ArrayList<Double>(getValues()); if (sortedList.size() == 0) return null; Collections.sort(sortedList); @@ -555,10 +561,10 @@ public DateMedian() { super(AttributeType.DATE, true); } - public DateMedian clone() { + @Override public DateMedian clone() { return new DateMedian(); } - public Date getResult() { + @Override public Date getResult() { List<Date> sortedList = new ArrayList<Date>(getValues()); if (sortedList.size() == 0) return null; Collections.sort(sortedList); @@ -570,10 +576,10 @@ public StringMajority(boolean ignoreNull) { super(AttributeType.STRING, ignoreNull); } - public StringMajority clone() { + @Override public StringMajority clone() { return new StringMajority(ignoreNull()); } - public String getResult() { + @Override public String getResult() { Map<String,Integer> map = new HashMap<String, Integer>(); for (Object value : getValues()) { String v = value==null?null:value.toString(); ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Jump-pilot-devel mailing list Jump-pilot-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel