Skip to content

Commit f3809db

Browse files
authored
Upgrade to h3 4.3.0 (#169)
1 parent 6cfc7ad commit f3809db

File tree

7 files changed

+158
-24
lines changed

7 files changed

+158
-24
lines changed

README.md

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
[![Coverage Status](https://coveralls.io/repos/github/uber/h3-java/badge.svg?branch=master)](https://coveralls.io/github/uber/h3-java?branch=master)
77
[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](LICENSE)
88
[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.uber/h3/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.uber/h3)
9-
[![H3 Version](https://img.shields.io/badge/h3-v4.2.1-blue.svg)](https://github.com/uber/h3/releases/tag/v4.2.1)
9+
[![H3 Version](https://img.shields.io/badge/h3-v4.3.0-blue.svg)](https://github.com/uber/h3/releases/tag/v4.3.0)
1010

1111
This library provides Java bindings for the [H3 Core Library](https://github.com/uber/h3). For API reference, please see the [H3 Documentation](https://h3geo.org/).
1212

@@ -62,22 +62,10 @@ You may be able to build H3-Java locally if you need to use an operating system
6262

6363
# Development
6464

65-
Building the library requires a JDK, Maven, CMake, and a C compiler. To install to your local Maven cache, run:
65+
Building the library requires a JDK, Gradle, CMake, and a C compiler. To build:
6666

6767
```sh
68-
mvn install
69-
```
70-
71-
To build the library, run:
72-
73-
```sh
74-
mvn package
75-
```
76-
77-
To format source code as required by CI, run:
78-
79-
```sh
80-
mvn com.spotify.fmt:fmt-maven-plugin:format
68+
./gradlew assemble test -Ph3UseDocker=false
8169
```
8270

8371
Additional information on how the build process works is available in the [build process documentaiton](docs/library-build.md).
@@ -86,7 +74,7 @@ Additional information on how the build process works is available in the [build
8674

8775
```sh
8876
# To install build dependencies
89-
sudo pkg install openjdk11 maven cmake bash
77+
sudo pkg install openjdk11 cmake bash
9078
# Ensure /usr/local/openjdk11/bin is on your path
9179
```
9280

@@ -95,15 +83,17 @@ sudo pkg install openjdk11 maven cmake bash
9583
To build Javadocs documentation:
9684

9785
```sh
98-
mvn site
86+
./gradlew javadoc -Ph3UseDocker=false
9987
```
10088

101-
Then open the file `target/site/apidocs/index.html`.
89+
Then open the file `build/docs/javadoc/index.html`.
10290

10391
## Benchmarking
10492

10593
To run benchmarks, either execute them from IntelliJ or run the following from shell: (Replace the class name as needed)
10694

95+
::: Note: These instructions need to be updated for Gradle.
96+
10797
```sh
10898
mvn exec:exec -Dexec.executable="java" -Dexec.args="-classpath %classpath com.uber.h3core.benchmarking.H3CoreBenchmark" -Dexec.classpathScope="test"
10999
```

build.gradle

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,10 @@ jar {
114114
duplicatesStrategy = DuplicatesStrategy.WARN
115115
}
116116

117+
sourcesJar {
118+
dependsOn buildH3
119+
}
120+
117121
publishing {
118122
publications {
119123
mavenJava(MavenPublication) {

h3version.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
h3.git.reference=v4.2.1
1+
h3.git.reference=v4.3.0

src/main/c/h3-java/src/jniapi.c

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -423,6 +423,28 @@ JNIEXPORT void JNICALL Java_com_uber_h3core_NativeMethods_gridDiskUnsafe(
423423
}
424424
}
425425

426+
/*
427+
* Class: com_uber_h3core_NativeMethods
428+
* Method: gridRing
429+
* Signature: (JI[J)V
430+
*/
431+
JNIEXPORT void JNICALL Java_com_uber_h3core_NativeMethods_gridRing(
432+
JNIEnv *env, jobject thiz, jlong h3, jint k, jlongArray results) {
433+
jlong *resultsElements = (**env).GetLongArrayElements(env, results, 0);
434+
435+
if (resultsElements != NULL) {
436+
// if sz is too small, bad things will happen
437+
H3Error err = gridRing(h3, k, resultsElements);
438+
439+
(**env).ReleaseLongArrayElements(env, results, resultsElements, 0);
440+
if (err) {
441+
ThrowH3Exception(env, err);
442+
}
443+
} else {
444+
ThrowOutOfMemoryError(env);
445+
}
446+
}
447+
426448
/*
427449
* Class: com_uber_h3core_NativeMethods
428450
* Method: gridRingUnsafe

src/main/java/com/uber/h3core/H3Core.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,34 @@ public List<List<Long>> gridDiskUnsafe(long h3, int k) {
318318
return ret;
319319
}
320320

321+
/**
322+
* Returns in order neighbor traversal, of indexes with distance of <code>k</code>.
323+
*
324+
* @param h3Address Origin index
325+
* @param k Number of rings around the origin
326+
* @return All indexes <code>k</code> away from the origin
327+
*/
328+
public List<String> gridRing(String h3Address, int k) {
329+
return h3ToStringList(gridRing(stringToH3(h3Address), k));
330+
}
331+
332+
/**
333+
* Returns in order neighbor traversal, of indexes with distance of <code>k</code>.
334+
*
335+
* @param h3 Origin index
336+
* @param k Number of rings around the origin
337+
* @return All indexes <code>k</code> away from the origin
338+
*/
339+
public List<Long> gridRing(long h3, int k) {
340+
int sz = k == 0 ? 1 : 6 * k;
341+
342+
long[] out = new long[sz];
343+
344+
h3Api.gridRing(h3, k, out);
345+
346+
return nonZeroLongArrayToList(out);
347+
}
348+
321349
/**
322350
* Returns in order neighbor traversal, of indexes with distance of <code>k</code>.
323351
*

src/main/java/com/uber/h3core/NativeMethods.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ final class NativeMethods {
5454

5555
native void gridDiskUnsafe(long h3, int k, long[] results);
5656

57+
native void gridRing(long h3, int k, long[] results);
58+
5759
native void gridRingUnsafe(long h3, int k, long[] results);
5860

5961
native long gridDistance(long a, long b);

src/test/java/com/uber/h3core/TestTraversal.java

Lines changed: 93 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ void hexRangePentagon() {
182182

183183
@Test
184184
void hexRing() {
185-
List<String> hexagons = h3.gridRingUnsafe("8928308280fffff", 1);
185+
List<String> hexagons = h3.gridRing("8928308280fffff", 1);
186186

187187
assertEquals(6, hexagons.size());
188188

@@ -196,7 +196,7 @@ void hexRing() {
196196

197197
@Test
198198
void hexRing2() {
199-
List<String> hexagons = h3.gridRingUnsafe("8928308280fffff", 2);
199+
List<String> hexagons = h3.gridRing("8928308280fffff", 2);
200200

201201
assertEquals(12, hexagons.size());
202202

@@ -217,7 +217,7 @@ void hexRing2() {
217217
@Test
218218
void hexRingLarge() {
219219
int k = 50;
220-
List<String> hexagons = h3.gridRingUnsafe("8928308280fffff", k);
220+
List<String> hexagons = h3.gridRing("8928308280fffff", k);
221221

222222
int expectedCount = 50 * 6;
223223

@@ -226,16 +226,104 @@ void hexRingLarge() {
226226

227227
@Test
228228
void hexRingPentagon() {
229-
assertThrows(H3Exception.class, () -> h3.gridRingUnsafe("821c07fffffffff", 1));
229+
List<String> hexagons = h3.gridRing("821c07fffffffff", 1);
230+
231+
assertEquals(5, hexagons.size());
232+
233+
assertTrue(hexagons.contains("821c37fffffffff"));
234+
assertTrue(hexagons.contains("821c17fffffffff"));
235+
assertTrue(hexagons.contains("821c1ffffffffff"));
236+
assertTrue(hexagons.contains("821c27fffffffff"));
237+
assertTrue(hexagons.contains("821c2ffffffffff"));
238+
239+
List<String> hexagons2 = h3.gridRing("821c07fffffffff", 2);
240+
241+
assertEquals(10, hexagons2.size());
230242
}
231243

232244
@Test
233245
void hexRingAroundPentagon() {
234-
assertThrows(H3Exception.class, () -> h3.gridRingUnsafe("821c37fffffffff", 2));
246+
List<String> hexagons = h3.gridRing("821c37fffffffff", 1);
247+
248+
assertEquals(6, hexagons.size());
249+
250+
assertTrue(hexagons.contains("821d8ffffffffff"));
251+
assertTrue(hexagons.contains("821c07fffffffff"));
252+
assertTrue(hexagons.contains("821c17fffffffff"));
253+
assertTrue(hexagons.contains("821d1ffffffffff"));
254+
assertTrue(hexagons.contains("821c27fffffffff"));
255+
assertTrue(hexagons.contains("821daffffffffff"));
256+
257+
List<String> hexagons2 = h3.gridRing("821c37fffffffff", 2);
258+
259+
assertEquals(11, hexagons2.size());
235260
}
236261

237262
@Test
238263
void hexRingSingle() {
264+
String origin = "8928308280fffff";
265+
List<String> hexagons = h3.gridRing(origin, 0);
266+
267+
assertEquals(1, hexagons.size());
268+
assertEquals("8928308280fffff", hexagons.get(0));
269+
}
270+
271+
@Test
272+
void hexRingUnsafe() {
273+
List<String> hexagons = h3.gridRingUnsafe("8928308280fffff", 1);
274+
275+
assertEquals(6, hexagons.size());
276+
277+
assertTrue(hexagons.contains("8928308280bffff"));
278+
assertTrue(hexagons.contains("89283082807ffff"));
279+
assertTrue(hexagons.contains("89283082877ffff"));
280+
assertTrue(hexagons.contains("89283082803ffff"));
281+
assertTrue(hexagons.contains("89283082873ffff"));
282+
assertTrue(hexagons.contains("8928308283bffff"));
283+
}
284+
285+
@Test
286+
void hexRing2Unsafe() {
287+
List<String> hexagons = h3.gridRingUnsafe("8928308280fffff", 2);
288+
289+
assertEquals(12, hexagons.size());
290+
291+
assertTrue(hexagons.contains("89283082813ffff"));
292+
assertTrue(hexagons.contains("89283082817ffff"));
293+
assertTrue(hexagons.contains("8928308281bffff"));
294+
assertTrue(hexagons.contains("89283082863ffff"));
295+
assertTrue(hexagons.contains("89283082823ffff"));
296+
assertTrue(hexagons.contains("8928308287bffff"));
297+
assertTrue(hexagons.contains("89283082833ffff"));
298+
assertTrue(hexagons.contains("8928308282bffff"));
299+
assertTrue(hexagons.contains("89283082857ffff"));
300+
assertTrue(hexagons.contains("892830828abffff"));
301+
assertTrue(hexagons.contains("89283082847ffff"));
302+
assertTrue(hexagons.contains("89283082867ffff"));
303+
}
304+
305+
@Test
306+
void hexRingLargeUnsafe() {
307+
int k = 50;
308+
List<String> hexagons = h3.gridRingUnsafe("8928308280fffff", k);
309+
310+
int expectedCount = 50 * 6;
311+
312+
assertEquals(expectedCount, hexagons.size());
313+
}
314+
315+
@Test
316+
void hexRingPentagonUnsafe() {
317+
assertThrows(H3Exception.class, () -> h3.gridRingUnsafe("821c07fffffffff", 1));
318+
}
319+
320+
@Test
321+
void hexRingAroundPentagonUnsafe() {
322+
assertThrows(H3Exception.class, () -> h3.gridRingUnsafe("821c37fffffffff", 2));
323+
}
324+
325+
@Test
326+
void hexRingSingleUnsafe() {
239327
String origin = "8928308280fffff";
240328
List<String> hexagons = h3.gridRingUnsafe(origin, 0);
241329

0 commit comments

Comments
 (0)