use of org.wikidata.wdtk.datamodel.interfaces.TimeValue in project OpenRefine by OpenRefine.
the class LaxValueMatcher method match.
@Override
public boolean match(Value existing, Value added) {
if (existing instanceof EntityIdValue && added instanceof EntityIdValue) {
// to mix up entities from different Wikibases in the same data slot
return ((EntityIdValue) existing).getId().equals(((EntityIdValue) added).getId());
} else if (existing instanceof StringValue && added instanceof StringValue) {
// disregard trailing whitespace differences
String existingStr = ((StringValue) existing).getString().trim();
String addedStr = ((StringValue) added).getString().trim();
// if they look like URLs, then http(s) and trailing slashes do not matter
try {
URI existingUrl = extraURINormalize(new URI(existingStr).normalize());
URI addedUrl = extraURINormalize(new URI(addedStr).normalize());
return existingUrl.equals(addedUrl);
} catch (URISyntaxException e) {
// fall back on basic comparison
;
}
return existingStr.equals(addedStr);
} else if (existing instanceof MonolingualTextValue && added instanceof MonolingualTextValue) {
// ignore differences of trailing whitespace
MonolingualTextValue existingMTV = (MonolingualTextValue) existing;
MonolingualTextValue addedMTV = (MonolingualTextValue) added;
return (existingMTV.getLanguageCode().equals(addedMTV.getLanguageCode()) && existingMTV.getText().trim().equals(addedMTV.getText().trim()));
} else if (existing instanceof QuantityValue && added instanceof QuantityValue) {
QuantityValue existingQuantity = (QuantityValue) existing;
QuantityValue addedQuantity = (QuantityValue) added;
BigDecimal existingLowerBound = existingQuantity.getLowerBound();
BigDecimal addedLowerBound = addedQuantity.getLowerBound();
BigDecimal existingUpperBound = existingQuantity.getUpperBound();
BigDecimal addedUpperBound = addedQuantity.getUpperBound();
// artificially set bounds for quantities which have neither lower nor upper bounds
if (existingLowerBound == null && existingUpperBound == null) {
existingLowerBound = existingQuantity.getNumericValue();
existingUpperBound = existingQuantity.getNumericValue();
}
if (addedLowerBound == null && addedUpperBound == null) {
addedLowerBound = addedQuantity.getNumericValue();
addedUpperBound = addedQuantity.getNumericValue();
}
if (existingQuantity.getUnit().equals(addedQuantity.getUnit()) && (existingLowerBound != null) && (addedLowerBound != null) && (existingUpperBound != null) && (addedUpperBound != null)) {
// Consider the two values to be equal when their confidence interval overlaps
return ((existingLowerBound.compareTo(addedLowerBound) <= 0 && addedLowerBound.compareTo(existingUpperBound) <= 0) || (addedLowerBound.compareTo(existingLowerBound) <= 0 && existingLowerBound.compareTo(addedUpperBound) <= 0));
}
} else if (existing instanceof GlobeCoordinatesValue && added instanceof GlobeCoordinatesValue) {
GlobeCoordinatesValue addedCoords = (GlobeCoordinatesValue) added;
GlobeCoordinatesValue existingCoords = (GlobeCoordinatesValue) existing;
if (!addedCoords.getGlobeItemId().getId().equals(existingCoords.getGlobeItemId().getId())) {
return false;
}
double addedMinLon = addedCoords.getLongitude() - addedCoords.getPrecision();
double addedMaxLon = addedCoords.getLongitude() + addedCoords.getPrecision();
double addedMinLat = addedCoords.getLatitude() - addedCoords.getPrecision();
double addedMaxLat = addedCoords.getLatitude() + addedCoords.getPrecision();
double existingMinLon = existingCoords.getLongitude() - existingCoords.getPrecision();
double existingMaxLon = existingCoords.getLongitude() + existingCoords.getPrecision();
double existingMinLat = existingCoords.getLatitude() - existingCoords.getPrecision();
double existingMaxLat = existingCoords.getLatitude() + existingCoords.getPrecision();
// return true when the two "rectangles" (in coordinate space) overlap (not strictly)
return ((addedMinLon <= existingMinLon && addedMinLat <= existingMinLat && existingMinLon <= addedMaxLon && existingMinLat <= addedMaxLat) || (existingMinLon <= addedMinLon && existingMinLat <= addedMinLat && addedMinLon <= existingMaxLon && addedMinLat <= existingMaxLat));
} else if (existing instanceof TimeValue && added instanceof TimeValue) {
TimeValue existingTime = (TimeValue) existing;
TimeValue addedTime = (TimeValue) added;
if (!existingTime.getPreferredCalendarModel().equals(addedTime.getPreferredCalendarModel())) {
return false;
}
int minPrecision = Math.min(existingTime.getPrecision(), addedTime.getPrecision());
if (minPrecision <= 9) {
// the precision is a multiple of years
long yearPrecision = (long) Math.pow(10, 9 - minPrecision);
long addedValue = addedTime.getYear() / yearPrecision;
long existingValue = existingTime.getYear() / yearPrecision;
return addedValue == existingValue;
} else if (minPrecision == 10) {
// month precision
return (addedTime.getYear() == existingTime.getYear() && addedTime.getMonth() == existingTime.getMonth());
} else if (minPrecision == 11) {
// day precision
return (addedTime.getYear() == existingTime.getYear() && addedTime.getMonth() == existingTime.getMonth() && addedTime.getDay() == existingTime.getDay());
}
// TODO possible improvements: bounds support, timezone support
}
// fall back to exact comparison for other datatypes
return existing.equals(added);
}
use of org.wikidata.wdtk.datamodel.interfaces.TimeValue in project OpenRefine by OpenRefine.
the class CalendarScrutinizer method scrutinize.
@Override
public void scrutinize(Value value) {
if (value instanceof TimeValue) {
TimeValue time = (TimeValue) value;
if (time.getPreferredCalendarModel().equals(earliestGregorian.getPreferredCalendarModel()) && time.getPrecision() >= 10 && (time.getYear() < earliestGregorian.getYear() || time.getYear() == earliestGregorian.getYear() && time.getMonth() < earliestGregorian.getMonth() || time.getYear() == earliestGregorian.getYear() && time.getMonth() == earliestGregorian.getMonth() && time.getDay() < earliestGregorian.getDay())) {
QAWarning warning = new QAWarning(earlyGregorianDateType, null, QAWarning.Severity.WARNING, 1);
warning.setProperty("example_year", Long.toString(time.getYear()));
addIssue(warning);
}
}
}
Aggregations