Bläddra i källkod

fix invalid location model, use null instead

tags/v1.5.4
Jonathan Cobb 4 år sedan
förälder
incheckning
3b601a3294
4 ändrade filer med 24 tillägg och 18 borttagningar
  1. +10
    -3
      bubble-server/src/main/java/bubble/cloud/CloudRegionRelative.java
  2. +5
    -7
      bubble-server/src/main/java/bubble/cloud/geoLocation/GeoLocation.java
  3. +7
    -7
      bubble-server/src/main/java/bubble/model/cloud/RegionalServiceDriver.java
  4. +2
    -1
      bubble-server/src/main/java/bubble/service/cloud/GeoService.java

+ 10
- 3
bubble-server/src/main/java/bubble/cloud/CloudRegionRelative.java Visa fil

@@ -19,7 +19,8 @@ public class CloudRegionRelative extends CloudRegion {


public CloudRegionRelative(CloudRegion region) { copy(this, region); } public CloudRegionRelative(CloudRegion region) { copy(this, region); }


@Getter @Setter private double distance;
@Getter @Setter private Double distance;
public boolean hasDistance () { return distance != null; }


public void setDistance(double latitude, double longitude) { public void setDistance(double latitude, double longitude) {
if (hasLocation()) distance = getLocation().distance(latitude, longitude); if (hasLocation()) distance = getLocation().distance(latitude, longitude);
@@ -29,8 +30,14 @@ public class CloudRegionRelative extends CloudRegion {


public static class CloudRegionRelativeComparator implements Comparator<CloudRegionRelative> { public static class CloudRegionRelativeComparator implements Comparator<CloudRegionRelative> {
@Override public int compare(CloudRegionRelative crr1, CloudRegionRelative crr2) { @Override public int compare(CloudRegionRelative crr1, CloudRegionRelative crr2) {
final int diff = Double.compare(crr1.getDistance(), crr2.getDistance());
if (diff != 0) return diff;
if (crr1.hasDistance() && crr2.hasDistance()) {
final int diff = Double.compare(crr1.getDistance(), crr2.getDistance());
if (diff != 0) return diff;
} else if (crr1.hasDistance()) {
return -1;
} else if (crr2.hasDistance()) {
return 1;
}
return crr1.getInternalName().compareTo(crr2.getInternalName()); return crr1.getInternalName().compareTo(crr2.getInternalName());
} }
} }


+ 5
- 7
bubble-server/src/main/java/bubble/cloud/geoLocation/GeoLocation.java Visa fil

@@ -32,8 +32,7 @@ public class GeoLocation {


public static final GeoLocation DEFAULT_GEO_LOCATION = GEO_ATLANTA; public static final GeoLocation DEFAULT_GEO_LOCATION = GEO_ATLANTA;


public static final GeoLocation NULL_LOCATION = new GeoLocation().setLat("-1.0").setLon("-1.0");
public static final double INVALID_LOCATION = -1.0;
public static final GeoLocation NULL_LOCATION = new GeoLocation();


public GeoLocation(String country) { public GeoLocation(String country) {
copy(this, NULL_LOCATION); copy(this, NULL_LOCATION);
@@ -63,11 +62,11 @@ public class GeoLocation {
big(g2.getLon()).doubleValue()); big(g2.getLon()).doubleValue());
} }


public double distance(double lat, double lon) {
if (lat < 0 || lon < 0) return INVALID_LOCATION;
public Double distance(double lat, double lon) {
if (lat < 0 || lon < 0) return null;
double thisLat = big(getLat()).doubleValue(); double thisLat = big(getLat()).doubleValue();
double thisLon = big(getLon()).doubleValue(); double thisLon = big(getLon()).doubleValue();
if (thisLat < 0 || thisLon < 0) return INVALID_LOCATION;
if (thisLat < 0 || thisLon < 0) return null;
return Haversine.distance( return Haversine.distance(
thisLat, thisLat,
lat, lat,
@@ -91,8 +90,7 @@ public class GeoLocation {


public boolean hasLatLon() { public boolean hasLatLon() {
try { try {
distance(0, 0);
return true;
return distance(0, 0) != null;
} catch (Exception e) { } catch (Exception e) {
return false; return false;
} }


+ 7
- 7
bubble-server/src/main/java/bubble/model/cloud/RegionalServiceDriver.java Visa fil

@@ -27,16 +27,16 @@ public interface RegionalServiceDriver {
static List<CloudRegionRelative> findClosestRegions(BubbleConfiguration configuration, static List<CloudRegionRelative> findClosestRegions(BubbleConfiguration configuration,
List<CloudService> clouds, List<CloudService> clouds,
BubbleFootprint footprint, BubbleFootprint footprint,
double latitude,
double longitude) {
Double latitude,
Double longitude) {
return findClosestRegions(configuration, clouds, footprint, latitude, longitude, null, true); return findClosestRegions(configuration, clouds, footprint, latitude, longitude, null, true);
} }


static List<CloudRegionRelative> findClosestRegions(BubbleConfiguration configuration, static List<CloudRegionRelative> findClosestRegions(BubbleConfiguration configuration,
List<CloudService> clouds, List<CloudService> clouds,
BubbleFootprint footprint, BubbleFootprint footprint,
double latitude,
double longitude,
Double latitude,
Double longitude,
Collection<CloudAndRegion> exclude, Collection<CloudAndRegion> exclude,
boolean latLonIsValid) { boolean latLonIsValid) {


@@ -60,7 +60,7 @@ public interface RegionalServiceDriver {
addRegionWithUnknownDistance(allRegions, c, region); addRegionWithUnknownDistance(allRegions, c, region);
continue; continue;
} }
if (latitude == INVALID_LOCATION && longitude == INVALID_LOCATION) {
if (latitude == null || longitude == null) {
// region has a location, we can never match with invalid coordinates // region has a location, we can never match with invalid coordinates
addRegionWithUnknownDistance(allRegions, c, region); addRegionWithUnknownDistance(allRegions, c, region);
continue; continue;
@@ -70,7 +70,7 @@ public interface RegionalServiceDriver {
} }
final CloudRegionRelative r = new CloudRegionRelative(region); final CloudRegionRelative r = new CloudRegionRelative(region);
r.setCloud(c.getUuid()); r.setCloud(c.getUuid());
if (latLonIsValid && latitude >= 0 && longitude >= 0) {
if (latLonIsValid) {
r.setDistance(latitude, longitude); r.setDistance(latitude, longitude);
} else { } else {
r.setDistance(DEFAULT_GEO_LOCATION.getLatitude(), DEFAULT_GEO_LOCATION.getLongitude()); r.setDistance(DEFAULT_GEO_LOCATION.getLatitude(), DEFAULT_GEO_LOCATION.getLongitude());
@@ -87,7 +87,7 @@ public interface RegionalServiceDriver {
CloudService c, CloudService c,
CloudRegion region) { CloudRegion region) {
final CloudRegionRelative r = new CloudRegionRelative(region); final CloudRegionRelative r = new CloudRegionRelative(region);
r.setDistance(0);
r.setDistance(null);
r.setCloud(c.getUuid()); r.setCloud(c.getUuid());
allRegions.add(r); allRegions.add(r);
} }


+ 2
- 1
bubble-server/src/main/java/bubble/service/cloud/GeoService.java Visa fil

@@ -189,7 +189,8 @@ public class GeoService {
// throw out any that are more than 50km off the average // throw out any that are more than 50km off the average
final List<GeoLocation> near = new ArrayList<>(); final List<GeoLocation> near = new ArrayList<>();
for (GeoLocation loc : resolved) { for (GeoLocation loc : resolved) {
if (loc.distance(averageLat, averageLon) <= LOC_MAX_DISTANCE) {
final Double distance = loc.distance(averageLat, averageLon);
if (distance != null && distance <= LOC_MAX_DISTANCE) {
near.add(loc); near.add(loc);
} }
} }


Laddar…
Avbryt
Spara