Skip to content

Commit

Permalink
fix json contains
Browse files Browse the repository at this point in the history
  • Loading branch information
samuelcolvin committed Apr 23, 2024
1 parent dde856b commit dfaaea4
Show file tree
Hide file tree
Showing 13 changed files with 152 additions and 171 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@

## Done

* [x] `json_contains(json: str, *keys: str | int) -> bool` - true if a JSON object has a specific key
* [x] `json_get(json: str, *keys: str | int) -> JsonUnion` - Get a value from a JSON object by it's "path"
* [x] `json_get_str(json: str, *keys: str | int) -> str` - Get a string value from a JSON object by it's "path"
* [x] `json_get_int(json: str, *keys: str | int) -> int` - Get an integer value from a JSON object by it's "path"
* [x] `json_get_float(json: str, *keys: str | int) -> float` - Get a float value from a JSON object by it's "path"
* [x] `json_get_bool(json: str, *keys: str | int) -> bool` - Get a boolean value from a JSON object by it's "path"
* [x] `json_get_json(json: str, *keys: str | int) -> str` - Get any value from a JSON object by it's "path", represented as a string
* [x] `json_obj_contains(json: str, key: str) -> bool` - true if a JSON object has a specific key

## TODO

Expand Down
File renamed without changes.
72 changes: 72 additions & 0 deletions src/json_contains.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
use std::any::Any;
use std::sync::Arc;

use arrow_schema::DataType;
use datafusion_common::arrow::array::{ArrayRef, BooleanArray};
use datafusion_common::{plan_err, Result, ScalarValue};
use datafusion_expr::{ColumnarValue, ScalarUDFImpl, Signature, Volatility};

use crate::common::{check_args, get_invoke, jiter_json_find, GetError, JsonPath};
use crate::common_macros::make_udf_function;

make_udf_function!(
JsonContains,
json_contains,
json_data path,
r#"Does the key/index exist within the JSON value as the specified "path"?"#
);

#[derive(Debug)]
pub(super) struct JsonContains {
signature: Signature,
aliases: [String; 1],
}

impl Default for JsonContains {
fn default() -> Self {
Self {
signature: Signature::variadic_any(Volatility::Immutable),
aliases: ["json_contains".to_string()],
}
}
}

impl ScalarUDFImpl for JsonContains {
fn as_any(&self) -> &dyn Any {
self
}

fn name(&self) -> &str {
self.aliases[0].as_str()
}

fn signature(&self) -> &Signature {
&self.signature
}

fn return_type(&self, arg_types: &[DataType]) -> Result<DataType> {
if arg_types.len() < 2 {
plan_err!("The `json_contains` function requires two or more arguments.")
} else {
check_args(arg_types, self.name()).map(|()| DataType::Boolean)
}
}

fn invoke(&self, args: &[ColumnarValue]) -> Result<ColumnarValue> {
get_invoke::<BooleanArray, bool>(
args,
jiter_json_contains,
|c| Ok(Arc::new(c) as ArrayRef),
ScalarValue::Boolean,
)
}

fn aliases(&self) -> &[String] {
&self.aliases
}
}

fn jiter_json_contains(json_data: Option<&str>, path: &[JsonPath]) -> Result<bool, GetError> {
dbg!(path);
Ok(jiter_json_find(json_data, path).is_some())
}
10 changes: 5 additions & 5 deletions src/json_get.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,14 @@ use datafusion_common::Result as DataFusionResult;
use datafusion_expr::{ColumnarValue, ScalarUDFImpl, Signature, Volatility};
use jiter::{Jiter, NumberAny, NumberInt, Peek};

use crate::common_get::{check_args, get_err, get_invoke, jiter_json_find, GetError, JsonPath};
use crate::common::{check_args, get_err, get_invoke, jiter_json_find, GetError, JsonPath};
use crate::common_macros::make_udf_function;
use crate::common_union::{JsonUnion, JsonUnionField};

make_udf_function!(
JsonGet,
json_get,
json_data key, // arg name
json_data path,
r#"Get a value from a JSON object by it's "path""#
);

Expand All @@ -24,14 +24,14 @@ make_udf_function!(
#[derive(Debug)]
pub(super) struct JsonGet {
signature: Signature,
aliases: Vec<String>,
aliases: [String; 1],
}

impl Default for JsonGet {
fn default() -> Self {
Self {
signature: Signature::variadic(vec![DataType::Utf8, DataType::UInt64], Volatility::Immutable),
aliases: vec!["json_get".to_string(), "json_get_union".to_string()],
signature: Signature::variadic_any(Volatility::Immutable),
aliases: ["json_get".to_string()],
}
}
}
Expand Down
8 changes: 4 additions & 4 deletions src/json_get_bool.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,27 +7,27 @@ use datafusion_common::{Result as DataFusionResult, ScalarValue};
use datafusion_expr::{ColumnarValue, ScalarUDFImpl, Signature, Volatility};
use jiter::Peek;

use crate::common_get::{check_args, get_err, get_invoke, jiter_json_find, GetError, JsonPath};
use crate::common::{check_args, get_err, get_invoke, jiter_json_find, GetError, JsonPath};
use crate::common_macros::make_udf_function;

make_udf_function!(
JsonGetBool,
json_get_bool,
json_data path, // arg name
json_data path,
r#"Get an boolean value from a JSON object by it's "path""#
);

#[derive(Debug)]
pub(super) struct JsonGetBool {
signature: Signature,
aliases: Vec<String>,
aliases: [String; 1],
}

impl Default for JsonGetBool {
fn default() -> Self {
Self {
signature: Signature::variadic_any(Volatility::Immutable),
aliases: vec!["json_get_bool".to_string()],
aliases: ["json_get_bool".to_string()],
}
}
}
Expand Down
8 changes: 4 additions & 4 deletions src/json_get_float.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,27 +7,27 @@ use datafusion_common::{Result as DataFusionResult, ScalarValue};
use datafusion_expr::{ColumnarValue, ScalarUDFImpl, Signature, Volatility};
use jiter::{NumberAny, Peek};

use crate::common_get::{check_args, get_err, get_invoke, jiter_json_find, GetError, JsonPath};
use crate::common::{check_args, get_err, get_invoke, jiter_json_find, GetError, JsonPath};
use crate::common_macros::make_udf_function;

make_udf_function!(
JsonGetFloat,
json_get_float,
json_data path, // arg name
json_data path,
r#"Get a float value from a JSON object by it's "path""#
);

#[derive(Debug)]
pub(super) struct JsonGetFloat {
signature: Signature,
aliases: Vec<String>,
aliases: [String; 1],
}

impl Default for JsonGetFloat {
fn default() -> Self {
Self {
signature: Signature::variadic_any(Volatility::Immutable),
aliases: vec!["json_get_float".to_string()],
aliases: ["json_get_float".to_string()],
}
}
}
Expand Down
8 changes: 4 additions & 4 deletions src/json_get_int.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,27 +7,27 @@ use datafusion_common::{Result as DataFusionResult, ScalarValue};
use datafusion_expr::{ColumnarValue, ScalarUDFImpl, Signature, Volatility};
use jiter::{NumberInt, Peek};

use crate::common_get::{check_args, get_err, get_invoke, jiter_json_find, GetError, JsonPath};
use crate::common::{check_args, get_err, get_invoke, jiter_json_find, GetError, JsonPath};
use crate::common_macros::make_udf_function;

make_udf_function!(
JsonGetInt,
json_get_int,
json_data path, // arg name
json_data path,
r#"Get an integer value from a JSON object by it's "path""#
);

#[derive(Debug)]
pub(super) struct JsonGetInt {
signature: Signature,
aliases: Vec<String>,
aliases: [String; 1],
}

impl Default for JsonGetInt {
fn default() -> Self {
Self {
signature: Signature::variadic_any(Volatility::Immutable),
aliases: vec!["json_get_int".to_string()],
aliases: ["json_get_int".to_string()],
}
}
}
Expand Down
8 changes: 4 additions & 4 deletions src/json_get_json.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,27 +6,27 @@ use arrow_schema::DataType;
use datafusion_common::{Result as DataFusionResult, ScalarValue};
use datafusion_expr::{ColumnarValue, ScalarUDFImpl, Signature, Volatility};

use crate::common_get::{check_args, get_err, get_invoke, jiter_json_find, GetError, JsonPath};
use crate::common::{check_args, get_err, get_invoke, jiter_json_find, GetError, JsonPath};
use crate::common_macros::make_udf_function;

make_udf_function!(
JsonGetJson,
json_get_json,
json_data path, // arg name
json_data path,
r#"Get any value from a JSON object by it's "path", represented as a string"#
);

#[derive(Debug)]
pub(super) struct JsonGetJson {
signature: Signature,
aliases: Vec<String>,
aliases: [String; 1],
}

impl Default for JsonGetJson {
fn default() -> Self {
Self {
signature: Signature::variadic_any(Volatility::Immutable),
aliases: vec!["json_get_json".to_string()],
aliases: ["json_get_json".to_string()],
}
}
}
Expand Down
8 changes: 4 additions & 4 deletions src/json_get_str.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,27 +7,27 @@ use datafusion_common::{Result as DataFusionResult, ScalarValue};
use datafusion_expr::{ColumnarValue, ScalarUDFImpl, Signature, Volatility};
use jiter::Peek;

use crate::common_get::{check_args, get_err, get_invoke, jiter_json_find, GetError, JsonPath};
use crate::common::{check_args, get_err, get_invoke, jiter_json_find, GetError, JsonPath};
use crate::common_macros::make_udf_function;

make_udf_function!(
JsonGetStr,
json_get_str,
json_data path, // arg name
json_data path,
r#"Get a string value from a JSON object by it's "path""#
);

#[derive(Debug)]
pub(super) struct JsonGetStr {
signature: Signature,
aliases: Vec<String>,
aliases: [String; 1],
}

impl Default for JsonGetStr {
fn default() -> Self {
Self {
signature: Signature::variadic_any(Volatility::Immutable),
aliases: vec!["json_get_str".to_string()],
aliases: ["json_get_str".to_string()],
}
}
}
Expand Down
100 changes: 0 additions & 100 deletions src/json_obj_contains.rs

This file was deleted.

Loading

0 comments on commit dfaaea4

Please sign in to comment.