Skip to content

Commit 876dfbf

Browse files
committed
change sort function by jsonata realisation and remove test overrides
1 parent bf8ec3a commit 876dfbf

2 files changed

Lines changed: 49 additions & 38 deletions

File tree

src/main/java/com/dashjoin/jsonata/Functions.java

Lines changed: 49 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1950,38 +1950,59 @@ public static List sort(List arr, Object comparator) {
19501950
return arr;
19511951
}
19521952

1953-
List result = new ArrayList<>(arr);
19541953

19551954
if (comparator != null) {
1956-
Comparator comp = new Comparator() {
1957-
1958-
@Override
1959-
public int compare(Object o1, Object o2) {
1960-
try {
1961-
Boolean swap = toBoolean(funcApply(comparator, Arrays.asList(o1, o2)));
1962-
if (swap == null)
1963-
return 0;
1964-
if (swap)
1965-
return 1;
1966-
else
1967-
return -1;
1968-
} catch (Throwable e) {
1969-
// TODO Auto-generated catch block
1970-
//e.printStackTrace();
1971-
throw new RuntimeException(e);
1972-
}
1973-
}
1974-
1975-
};
1976-
if (comparator instanceof Comparator)
1977-
result.sort((Comparator)comparator);
1978-
else
1979-
result.sort((Comparator)comp);
1980-
} else {
1981-
result.sort(null);
1955+
if (comparator instanceof Comparator) {
1956+
List sorted = new ArrayList<>(arr);
1957+
sorted.sort((Comparator) comparator);
1958+
return sorted;
1959+
}
1960+
1961+
Object[] sorted = arr.toArray();
1962+
Object[] buffer = new Object[sorted.length];
1963+
mergeSort(sorted, buffer, 0, sorted.length - 1, comparator);
1964+
List result = new ArrayList<>(sorted.length);
1965+
Collections.addAll(result, sorted);
1966+
return result;
19821967
}
19831968

1984-
return result;
1969+
List sorted = new ArrayList<>(arr);
1970+
sorted.sort(null);
1971+
return sorted;
1972+
}
1973+
1974+
private static void mergeSort(Object[] sorted, Object[] buffer, int lo, int hi, Object jsonataComparator) {
1975+
if (lo >= hi) {
1976+
return;
1977+
}
1978+
int mid = (lo + hi) / 2;
1979+
mergeSort(sorted, buffer, lo, mid, jsonataComparator);
1980+
mergeSort(sorted, buffer, mid + 1, hi, jsonataComparator);
1981+
merge(sorted, buffer, lo, mid, hi, jsonataComparator);
1982+
}
1983+
1984+
private static void merge(Object[] sorted, Object[] buffer, int lo, int mid, int hi, Object jsonataComparator) {
1985+
int i = lo, j = mid + 1, k = lo;
1986+
1987+
while (i <= mid && j <= hi) {
1988+
boolean swap;
1989+
try {
1990+
Boolean sw = toBoolean(funcApply(jsonataComparator, Arrays.asList(sorted[i], sorted[j])));
1991+
swap = Boolean.TRUE.equals(sw);
1992+
} catch (Throwable e) {
1993+
throw new RuntimeException(e);
1994+
}
1995+
1996+
if (swap) {
1997+
buffer[k++] = sorted[j++];
1998+
} else {
1999+
buffer[k++] = sorted[i++];
2000+
}
2001+
}
2002+
while (i <= mid) buffer[k++] = sorted[i++];
2003+
while (j <= hi) buffer[k++] = sorted[j++];
2004+
2005+
System.arraycopy(buffer, lo, sorted, lo, hi - lo + 1);
19852006
}
19862007

19872008
/**

test/test-overrides.json

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -130,16 +130,6 @@
130130
"alternateResult": "1e+20",
131131
"reason": "toString precision should be 15, handled differently by Java Bigdecimal(..., new MathContext(15)"
132132
},
133-
{
134-
"name": "function-sort/case009.json",
135-
"alternateResult": ["0406634348", "040657863", "0406654608", "0406654603"],
136-
"reason": "the sort expression is evaluated correctly - however the sort algorithm seems to behave slightly different for equality - jsonata expects the native order to be preserved"
137-
},
138-
{
139-
"name": "function-sort/case010.json",
140-
"alternateResult": ["0406634348", "0406654608", "040657863", "0406654603"],
141-
"reason": "same as above, works if the condition is changed to >="
142-
},
143133
{
144134
"name": "function-applications/case008.json",
145135
"ignoreError": true,

0 commit comments

Comments
 (0)