Skip to content

Commit

Permalink
Implements Geometry point
Browse files Browse the repository at this point in the history
  • Loading branch information
emmanuel-keller committed Jun 22, 2024
1 parent f2f1cbd commit 31a4f05
Show file tree
Hide file tree
Showing 6 changed files with 95 additions and 2 deletions.
15 changes: 15 additions & 0 deletions src/main/java/com/surrealdb/Geometry.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.surrealdb;

import java.awt.geom.Point2D;

public class Geometry implements AutoCloseable {

private long id;
Expand All @@ -10,6 +12,10 @@ public class Geometry implements AutoCloseable {

private static native boolean deleteInstance(long id);

private static native boolean isPoint(long id);

private static native double[] getPoint(long id);

@Override
public void close() {
deleteInstance(id);
Expand All @@ -24,5 +30,14 @@ protected void finalize() throws Throwable {
super.finalize();
}
}

public boolean isPoint() {
return isPoint(id);
}

public Point2D.Double getPoint() {
final double[] coord = getPoint(id);
return new Point2D.Double(coord[0], coord[1]);
}
}

40 changes: 40 additions & 0 deletions src/main/rust/geometry.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
use std::ptr::null_mut;
use std::sync::Arc;

use jni::JNIEnv;
use jni::objects::JClass;
use jni::sys::{jboolean, jdoubleArray, jlong};
use surrealdb::sql::{Geometry, Value};

use crate::{get_value_instance, new_double_point};
use crate::error::SurrealError;

#[no_mangle]
pub extern "system" fn Java_com_surrealdb_Geometry_isPoint<'local>(
mut env: JNIEnv<'local>,
_class: JClass<'local>,
id: jlong,
) -> jboolean {
let value = get_value_instance!(&mut env, id, ||false as jboolean);
if let Value::Geometry(g) = value.as_ref() {
g.is_point() as jboolean
} else {
SurrealError::NullPointerException("Thing").exception(&mut env, || false as jboolean)
}
}

#[no_mangle]
pub extern "system" fn Java_com_surrealdb_Geometry_getPoint<'local>(
mut env: JNIEnv<'local>,
_class: JClass<'local>,
id: jlong,
) -> jdoubleArray {
let value = get_value_instance!(&mut env, id, ||null_mut());
if let Value::Geometry(g) = value.as_ref() {
if let Geometry::Point(pt) = &g {
return new_double_point!(&mut env, pt, ||null_mut());
}
}
SurrealError::NullPointerException("Geometry/Point").exception(&mut env, || null_mut())
}

1 change: 1 addition & 0 deletions src/main/rust/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ mod object;
mod array;
mod thing;
mod id;
mod geometry;


static TOKIO_RUNTIME: Lazy<Runtime> =
Expand Down
17 changes: 17 additions & 0 deletions src/main/rust/macros.rs
Original file line number Diff line number Diff line change
Expand Up @@ -46,4 +46,21 @@ macro_rules! new_string {
Err(e) => return crate::SurrealError::from(e).exception($env, $default_fn),
}
};
}

#[macro_export]
macro_rules! new_double_point {
($env:expr, $pt:expr, $default_fn:expr) => {
{
let double_array = match $env.new_double_array(2) {
Ok(d) => d,
Err(e) => return crate::SurrealError::from(e).exception($env, $default_fn)
};
let coordinates: [jni::sys::jdouble; 2] = [$pt.x(), $pt.y()];
if let Err(e) = $env.set_double_array_region(&double_array, 0, &coordinates) {
return crate::SurrealError::from(e).exception($env, $default_fn);
}
double_array.into_raw()
}
};
}
14 changes: 14 additions & 0 deletions src/main/rust/value.rs
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,20 @@ pub extern "system" fn Java_com_surrealdb_Value_isGeometry<'local>(
value.is_geometry() as jboolean
}

#[no_mangle]
pub extern "system" fn Java_com_surrealdb_Value_getGeometry<'local>(
mut env: JNIEnv<'local>,
_class: JClass<'local>,
id: jlong,
) -> jlong {
let value = get_value_instance!(&mut env, id, ||0);
if let Value::Geometry(_) = value.as_ref() {
create_instance(value)
} else {
SurrealError::NullPointerException("Not a Geometry").exception(&mut env, || 0)
}
}

#[no_mangle]
pub extern "system" fn Java_com_surrealdb_Value_isNone<'local>(
mut env: JNIEnv<'local>,
Expand Down
10 changes: 8 additions & 2 deletions src/test/java/com/surrealdb/SurrealDBTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import org.junit.jupiter.api.Test;

import java.awt.geom.Point2D;
import java.util.UUID;

import static org.junit.jupiter.api.Assertions.*;
Expand Down Expand Up @@ -39,14 +40,15 @@ void surreal_db_memory() throws SurrealDBException {

}
//
String sql = "CREATE person:1 SET name = 'Tobie',category = 1, active=true, score=5.0f, tags=['CEO', 'CTO'], uuid= u'f8e238f2-e734-47b8-9a16-476b291bd78a';\n" +
String sql = "CREATE person:1 SET name = 'Tobie',category = 1, active=true, score=5.0f, tags=['CEO', 'CTO']," +
"uuid= u'f8e238f2-e734-47b8-9a16-476b291bd78a', pt = <geometry<point>> { type: \"Point\", coordinates: [-0.118092, 51.509865] };\n" +
"SELECT * FROM person;";
try (Response response = surreal.query(sql)) {
Value create = response.take(0);
assertTrue(create.isArray());
Array createArray = create.getArray();
assertEquals(createArray.len(), 1);
assertEquals("[{ active: true, category: 1, id: person:1, name: 'Tobie', score: 5f, tags: ['CEO', 'CTO'], uuid: 'f8e238f2-e734-47b8-9a16-476b291bd78a' }]", createArray.toString());
assertEquals("[{ active: true, category: 1, id: person:1, name: 'Tobie', pt: (-0.118092, 51.509865), score: 5f, tags: ['CEO', 'CTO'], uuid: 'f8e238f2-e734-47b8-9a16-476b291bd78a' }]", createArray.toString());
Value select = response.take(1);
assertTrue(select.isArray());
Array selectArray = select.getArray();
Expand All @@ -57,6 +59,7 @@ void surreal_db_memory() throws SurrealDBException {
"\t\tcategory: 1,\n" +
"\t\tid: person:1,\n" +
"\t\tname: 'Tobie',\n" +
"\t\tpt: (-0.118092, 51.509865),\n" +
"\t\tscore: 5f,\n" +
"\t\ttags: [\n" +
"\t\t\t'CEO',\n" +
Expand All @@ -83,6 +86,9 @@ void surreal_db_memory() throws SurrealDBException {
// Check String field
assertTrue(rowObject.get("name").isString());
assertEquals("Tobie", rowObject.get("name").getString());
// Check Geometry/Point field
assertTrue(rowObject.get("pt").isGeometry());
assertEquals(new Point2D.Double(-0.118092, 51.509865), rowObject.get("pt").getGeometry().getPoint());
// Check double field
assertTrue(rowObject.get("score").isDouble());
assertEquals(5.0, rowObject.get("score").getDouble());
Expand Down

0 comments on commit 31a4f05

Please sign in to comment.