DATACMNS-474 - Allow conversion of Distance into other Metrics.

Added support for distance conversion via Distance.in(Metric).
This commit is contained in:
Thomas Darimont
2014-03-21 13:07:23 +01:00
committed by Oliver Gierke
parent 176be042c9
commit b882d33d7b
2 changed files with 77 additions and 1 deletions

View File

@@ -30,7 +30,7 @@ public class Distance {
private final Metric metric;
/**
* Creates a new {@link Distance}.
* Creates a new {@link Distance} with a neutral metric. This means the provided value needs to be in normalized form.
*
* @param value
*/
@@ -45,6 +45,7 @@ public class Distance {
* @param metric can be {@literal null}.
*/
public Distance(double value, Metric metric) {
this.value = value;
this.metric = metric == null ? Metrics.NEUTRAL : metric;
}
@@ -110,6 +111,19 @@ public class Distance {
return new Distance(newLeft + newRight, metric);
}
/**
* Returns a new {@link Distance} in the given {@link Metric}. This means that the returned instance will have the
* same normalized value as the original instance.
*
* @param metric must not be {@literal null}.
* @return
*/
public Distance in(Metric metric) {
Assert.notNull(metric, "Metric must not be null!");
return this.metric.equals(metric) ? this : new Distance(getNormalizedValue() * metric.getMultiplier(), metric);
}
/*
* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)

View File

@@ -16,6 +16,7 @@
package org.springframework.data.geo;
import static org.hamcrest.CoreMatchers.*;
import static org.hamcrest.number.IsCloseTo.*;
import static org.junit.Assert.*;
import static org.springframework.data.geo.Metrics.*;
@@ -29,6 +30,10 @@ import org.junit.Test;
*/
public class DistanceUnitTests {
private static final double EPS = 0.000000001;
private static final double TEN_MILES_NORMALIZED = 0.002523219294755161;
private static final double TEN_KM_NORMALIZED = 0.001567855942887398;
/**
* @see DATACMNS-437
*/
@@ -62,4 +67,61 @@ public class DistanceUnitTests {
assertThat(left.add(right, MILES), is(new Distance(3.106856281073925, MILES)));
}
/**
* @see DATACMNS-474
*/
@Test
public void distanceWithSameMetricShoudEqualAfterConversion() {
assertThat(new Distance(1).in(NEUTRAL), is(new Distance(1)));
assertThat(new Distance(TEN_KM_NORMALIZED).in(KILOMETERS), is(new Distance(10, KILOMETERS)));
assertThat(new Distance(TEN_MILES_NORMALIZED).in(MILES), is(new Distance(10, MILES)));
}
/**
* @see DATACMNS-474
*/
@Test
public void distanceWithDifferentMetricShoudEqualAfterConversion() {
assertThat(new Distance(10, MILES), is(new Distance(TEN_MILES_NORMALIZED).in(MILES)));
assertThat(new Distance(10, KILOMETERS), is(new Distance(TEN_KM_NORMALIZED).in(KILOMETERS)));
}
/**
* @see DATACMNS-474
*/
@Test
public void conversionShouldProduceCorrectNormalizedValue() {
assertThat(new Distance(TEN_KM_NORMALIZED, NEUTRAL).in(KILOMETERS).getNormalizedValue(),
closeTo(new Distance(10, KILOMETERS).getNormalizedValue(), EPS));
assertThat(new Distance(TEN_KM_NORMALIZED).in(KILOMETERS).getNormalizedValue(),
closeTo(new Distance(10, KILOMETERS).getNormalizedValue(), EPS));
assertThat(new Distance(TEN_MILES_NORMALIZED).in(MILES).getNormalizedValue(),
closeTo(new Distance(10, MILES).getNormalizedValue(), EPS));
assertThat(new Distance(TEN_MILES_NORMALIZED).in(MILES).getNormalizedValue(),
closeTo(new Distance(16.09344, KILOMETERS).getNormalizedValue(), EPS));
assertThat(new Distance(TEN_MILES_NORMALIZED).in(KILOMETERS).getNormalizedValue(),
closeTo(new Distance(10, MILES).getNormalizedValue(), EPS));
assertThat(new Distance(10, KILOMETERS).in(MILES).getNormalizedValue(),
closeTo(new Distance(6.21371192, MILES).getNormalizedValue(), EPS));
}
/**
* @see DATACMNS-474
*/
@Test
public void toStringAfterConversion() {
assertThat(new Distance(10, KILOMETERS).in(MILES).toString(), is(new Distance(6.21371256214785, MILES).toString()));
assertThat(new Distance(6.21371256214785, MILES).in(KILOMETERS).toString(),
is(new Distance(10, KILOMETERS).toString()));
}
}