Skip to content

Commit 0572047

Browse files
Merge pull request #40 from OwnYourData/fix_bucket_ranges
Bucket ranges adjusted to leave no gaps
2 parents 9a58725 + 0092b9e commit 0572047

4 files changed

Lines changed: 38 additions & 4 deletions

File tree

src/main/java/com/example/anonymization/service/FaltJsonService.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import com.example.anonymization.data.QueryService;
44
import com.example.anonymization.entities.Configuration;
5-
import com.example.anonymization.exceptions.AnonymizationException;
65
import com.example.anonymization.exceptions.RequestModelException;
76
import com.fasterxml.jackson.core.JsonProcessingException;
87
import com.fasterxml.jackson.databind.ObjectMapper;

src/main/java/com/example/anonymization/service/anonymizer/Generalization.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ public void applyAnonymization() {
3838
}
3939

4040
protected abstract List<Pair<Resource, T>> getSortedValues(Map<Resource, RDFNode> data);
41+
protected abstract T getMedianValue(T value1, T value2);
4142

4243
protected Map<Resource, Resource> getRanges(
4344
List<Pair<Resource, T>> sortedValues,
@@ -98,9 +99,16 @@ protected List<Resource> createBuckets(
9899
}
99100

100101
protected List<T> getBucketRange(List<Pair<Resource, T>> sortedValues, int bucketNumber, int nrOfBuckets) {
101-
return List.of(
102-
sortedValues.get(bucketNumber * sortedValues.size() / nrOfBuckets).getRight(),
103-
sortedValues.get(((bucketNumber + 1) * sortedValues.size() / nrOfBuckets) - 1).getRight()
102+
int lowerBoundIndex = bucketNumber * sortedValues.size() / nrOfBuckets;
103+
T lowerBound = getMedianValue(
104+
lowerBoundIndex > 0 ? sortedValues.get(lowerBoundIndex - 1).getRight() : null,
105+
sortedValues.get(lowerBoundIndex).getRight()
104106
);
107+
int upperBoundIndex = ((bucketNumber + 1) * sortedValues.size() / nrOfBuckets) - 1;
108+
T upperBound = getMedianValue(
109+
sortedValues.get(upperBoundIndex).getRight(),
110+
upperBoundIndex + 1 < sortedValues.size() ? sortedValues.get(upperBoundIndex + 1).getRight() : null
111+
);
112+
return List.of(lowerBound, upperBound);
105113
}
106114
}

src/main/java/com/example/anonymization/service/anonymizer/GeneralizationDate.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,22 @@ protected List<Pair<Resource, Calendar>> getSortedValues(Map<Resource, RDFNode>
3030
.toList();
3131
}
3232

33+
@Override
34+
protected Calendar getMedianValue(Calendar value1, Calendar value2) {
35+
if (value1 == null) {
36+
return value2;
37+
}
38+
if (value2 == null) {
39+
return value1;
40+
}
41+
long time1 = value1.getTimeInMillis();
42+
long time2 = value2.getTimeInMillis();
43+
long medianTime = (time1 + time2) / 2;
44+
Calendar medianCalendar = Calendar.getInstance();
45+
medianCalendar.setTimeInMillis(medianTime);
46+
return medianCalendar;
47+
}
48+
3349
private static Calendar toDate(RDFNode node) {
3450
try {
3551
XSDDateTime xsdDateTime = (XSDDateTime) XSDDatatype.XSDdate.parse(node.asLiteral().getString());

src/main/java/com/example/anonymization/service/anonymizer/GeneralizationNumeric.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,15 @@ protected List<Pair<Resource, Double>> getSortedValues(Map<Resource, RDFNode> da
3333
throw new IllegalArgumentException("Error while parsing numeric values for generalization.", e);
3434
}
3535
}
36+
37+
@Override
38+
protected Double getMedianValue(Double value1, Double value2) {
39+
if (value1 == null) {
40+
return value2;
41+
}
42+
if (value2 == null) {
43+
return value1;
44+
}
45+
return (value1 + value2) / 2.0;
46+
}
3647
}

0 commit comments

Comments
 (0)