mirror of
https://github.com/fluencelabs/jsonpath
synced 2025-06-25 13:51:42 +00:00
remove alloc, dealloc in wasm
This commit is contained in:
@ -1,9 +1,6 @@
|
||||
use super::cmp::*;
|
||||
use super::value_filter::ValueFilterKey;
|
||||
use super::value_manager::*;
|
||||
use std::cell::RefCell;
|
||||
use select::path_map::PathMap;
|
||||
use std::sync::Arc;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum TermContext {
|
||||
@ -55,7 +52,7 @@ impl TermContext {
|
||||
}
|
||||
}
|
||||
|
||||
fn cmp_cond(&self, other: &TermContext, cmp_cond_type: CmpCondType, path_map: Arc<RefCell<PathMap>>) -> TermContext {
|
||||
fn cmp_cond(&self, other: &TermContext, cmp_cond_type: CmpCondType) -> TermContext {
|
||||
match self {
|
||||
TermContext::Constants(et) => {
|
||||
match other {
|
||||
@ -70,7 +67,7 @@ impl TermContext {
|
||||
}
|
||||
}
|
||||
TermContext::Json(_, v) => {
|
||||
TermContext::Json(None, ValueManager::new(v.get_val().clone(), false, path_map))
|
||||
TermContext::Json(None, ValueManager::new(v.get_val().clone(), false))
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -83,7 +80,7 @@ impl TermContext {
|
||||
}
|
||||
}
|
||||
_ => {
|
||||
TermContext::Json(None, ValueManager::new(v.get_val().clone(), false, path_map))
|
||||
TermContext::Json(None, ValueManager::new(v.get_val().clone(), false))
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -120,12 +117,12 @@ impl TermContext {
|
||||
self.cmp(other, CmpLe, false)
|
||||
}
|
||||
|
||||
pub fn and(&mut self, other: &mut TermContext, path_map: Arc<RefCell<PathMap>>) -> TermContext {
|
||||
self.cmp_cond(other, CmpCondType::And, path_map)
|
||||
pub fn and(&mut self, other: &mut TermContext) -> TermContext {
|
||||
self.cmp_cond(other, CmpCondType::And)
|
||||
}
|
||||
|
||||
pub fn or(&mut self, other: &mut TermContext, path_map: Arc<RefCell<PathMap>>) -> TermContext {
|
||||
self.cmp_cond(other, CmpCondType::Or, path_map)
|
||||
pub fn or(&mut self, other: &mut TermContext) -> TermContext {
|
||||
self.cmp_cond(other, CmpCondType::Or)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,6 +1,4 @@
|
||||
use std::cell::RefCell;
|
||||
use std::ops::Deref;
|
||||
use std::sync::Arc;
|
||||
|
||||
use serde_json::Value;
|
||||
|
||||
@ -8,7 +6,6 @@ use filter::term::*;
|
||||
use filter::value_manager::*;
|
||||
use parser::parser::{FilterToken, NodeVisitor, ParseToken};
|
||||
use ref_value::model::*;
|
||||
use select::path_map::PathMap;
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub enum ValueFilterKey {
|
||||
@ -52,16 +49,14 @@ pub struct ValueFilter {
|
||||
value_mgr: ValueManager,
|
||||
last_key: Option<ValueFilterKey>,
|
||||
is_relative: bool,
|
||||
path_map: Arc<RefCell<PathMap>>,
|
||||
}
|
||||
|
||||
impl ValueFilter {
|
||||
pub fn new(v: RefValueWrapper, is_leaves: bool, is_relative: bool, path_map: Arc<RefCell<PathMap>>) -> Self {
|
||||
pub fn new(v: RefValueWrapper, is_leaves: bool, is_relative: bool) -> Self {
|
||||
ValueFilter {
|
||||
value_mgr: ValueManager::new(v, is_leaves, path_map.clone()),
|
||||
value_mgr: ValueManager::new(v, is_leaves),
|
||||
last_key: None,
|
||||
is_relative,
|
||||
path_map,
|
||||
}
|
||||
}
|
||||
|
||||
@ -69,7 +64,7 @@ impl ValueFilter {
|
||||
let mut buf = Vec::new();
|
||||
collect_all(key, &self.value_mgr.get_val(), &mut buf);
|
||||
trace!("step_leaves - {:?}", buf);
|
||||
self.value_mgr = ValueManager::new(RefValue::Array(buf).into(), true, self.path_map.clone());
|
||||
self.value_mgr = ValueManager::new(RefValue::Array(buf).into(), true);
|
||||
}
|
||||
|
||||
pub fn step_leaves_all(&mut self) -> &ValueManager {
|
||||
@ -136,17 +131,15 @@ impl ValueFilter {
|
||||
|
||||
pub struct JsonValueFilter {
|
||||
json: RefValueWrapper,
|
||||
path_map: Arc<RefCell<PathMap>>,
|
||||
filter_stack: Vec<ValueFilter>,
|
||||
token_stack: Vec<ParseToken>,
|
||||
term_stack: Vec<TermContext>,
|
||||
}
|
||||
|
||||
impl JsonValueFilter {
|
||||
pub fn new(json: RefValueWrapper, path_map: Arc<RefCell<PathMap>>) -> Self {
|
||||
pub fn new(json: RefValueWrapper) -> Self {
|
||||
JsonValueFilter {
|
||||
json,
|
||||
path_map,
|
||||
filter_stack: Vec::new(),
|
||||
token_stack: Vec::new(),
|
||||
term_stack: Vec::new(),
|
||||
@ -164,7 +157,6 @@ impl JsonValueFilter {
|
||||
ValueFilter::new(vf.value_mgr.get_val().clone(),
|
||||
vf.value_mgr.is_leaves(),
|
||||
is_relative,
|
||||
self.path_map.clone(),
|
||||
)
|
||||
})
|
||||
.and_then(|vf| {
|
||||
@ -175,7 +167,6 @@ impl JsonValueFilter {
|
||||
self.json.clone(),
|
||||
false,
|
||||
is_relative,
|
||||
self.path_map.clone(),
|
||||
);
|
||||
self.filter_stack.push(vf);
|
||||
}
|
||||
@ -187,7 +178,6 @@ impl JsonValueFilter {
|
||||
v,
|
||||
is_leaves,
|
||||
false,
|
||||
self.path_map.clone(),
|
||||
));
|
||||
return;
|
||||
}
|
||||
@ -348,8 +338,8 @@ impl JsonValueFilter {
|
||||
FilterToken::GreaterOrEqual => left.ge(&mut right),
|
||||
FilterToken::Little => left.lt(&mut right),
|
||||
FilterToken::LittleOrEqual => left.le(&mut right),
|
||||
FilterToken::And => left.and(&mut right, self.path_map.clone()),
|
||||
FilterToken::Or => left.or(&mut right, self.path_map.clone()),
|
||||
FilterToken::And => left.and(&mut right),
|
||||
FilterToken::Or => left.or(&mut right),
|
||||
};
|
||||
self.term_stack.push(tc);
|
||||
}
|
||||
|
@ -1,12 +1,9 @@
|
||||
use std::cell::RefCell;
|
||||
use std::ops::Deref;
|
||||
use std::sync::Arc;
|
||||
|
||||
use indexmap::{IndexMap, IndexSet};
|
||||
use serde_json::Value;
|
||||
|
||||
use ref_value::model::*;
|
||||
use select::path_map::PathMap;
|
||||
|
||||
use super::cmp::*;
|
||||
use super::term::*;
|
||||
@ -176,13 +173,12 @@ pub type ValueWrapper = ValueManager;
|
||||
#[derive(Debug)]
|
||||
pub struct ValueManager {
|
||||
val: RefValueWrapper,
|
||||
path_map: Arc<RefCell<PathMap>>,
|
||||
is_leaves: bool,
|
||||
}
|
||||
|
||||
impl ValueManager {
|
||||
pub fn new(val: RefValueWrapper, is_leaves: bool, path_map: Arc<RefCell<PathMap>>) -> Self {
|
||||
ValueManager { val, is_leaves, path_map }
|
||||
pub fn new(val: RefValueWrapper, is_leaves: bool) -> Self {
|
||||
ValueManager { val, is_leaves }
|
||||
}
|
||||
|
||||
pub fn is_leaves(&self) -> bool {
|
||||
@ -226,16 +222,13 @@ impl ValueManager {
|
||||
}
|
||||
|
||||
let ret = set.into_iter().collect();
|
||||
Self::new(
|
||||
RefValue::Array(ret).into(),
|
||||
false,
|
||||
self.path_map.clone())
|
||||
Self::new(RefValue::Array(ret).into(), false)
|
||||
}
|
||||
_ => {
|
||||
if cmp_with_term(&self.val, et, &cmp, false, reverse) {
|
||||
Self::new(self.val.clone(), false, self.path_map.clone())
|
||||
Self::new(self.val.clone(), false)
|
||||
} else {
|
||||
Self::new(RefValue::Null.into(), false, self.path_map.clone())
|
||||
Self::new(RefValue::Null.into(), false)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -427,7 +420,7 @@ impl ValueManager {
|
||||
}
|
||||
|
||||
let vec = ret.into_iter().map(|v| v.clone()).collect();
|
||||
ValueManager::new(RefValue::Array(vec).into(), false, self.path_map.clone())
|
||||
ValueManager::new(RefValue::Array(vec).into(), false)
|
||||
}
|
||||
|
||||
pub fn intersect(&self, other: &Self) -> Self {
|
||||
@ -450,7 +443,7 @@ impl ValueManager {
|
||||
}
|
||||
|
||||
let vec = ret.into_iter().map(|v| v.clone()).collect();
|
||||
ValueManager::new(RefValue::Array(vec).into(), false, self.path_map.clone())
|
||||
ValueManager::new(RefValue::Array(vec).into(), false)
|
||||
}
|
||||
|
||||
pub fn union(&self, other: &Self) -> Self {
|
||||
@ -478,7 +471,7 @@ impl ValueManager {
|
||||
}
|
||||
|
||||
let vec = ret.into_iter().map(|v| v.clone()).collect();
|
||||
ValueManager::new(RefValue::Array(vec).into(), false, self.path_map.clone())
|
||||
ValueManager::new(RefValue::Array(vec).into(), false)
|
||||
}
|
||||
|
||||
pub fn into_term(&self, key: &Option<ValueFilterKey>) -> TermContext {
|
||||
@ -489,7 +482,7 @@ impl ValueManager {
|
||||
_ => TermContext::Json(match key {
|
||||
Some(vk) => Some(vk.clone()),
|
||||
_ => None
|
||||
}, ValueManager::new(self.val.clone(), false, self.path_map.clone()))
|
||||
}, ValueManager::new(self.val.clone(), false))
|
||||
}
|
||||
}
|
||||
|
||||
@ -519,6 +512,6 @@ impl ValueManager {
|
||||
_ => self.val.clone()
|
||||
};
|
||||
|
||||
ValueManager::new(v, false, self.path_map.clone())
|
||||
ValueManager::new(v, false)
|
||||
}
|
||||
}
|
||||
|
@ -1,3 +1,2 @@
|
||||
pub mod selector;
|
||||
pub mod modifiable;
|
||||
pub mod path_map;
|
||||
pub mod modifiable;
|
@ -1,53 +0,0 @@
|
||||
//use std::collections::HashMap;
|
||||
use std::ops::Deref;
|
||||
|
||||
use ref_value::model::{RefValue, RefValueWrapper};
|
||||
use indexmap::IndexMap;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct PathMap {
|
||||
map: IndexMap<RefValueWrapper, String>
|
||||
}
|
||||
|
||||
impl PathMap {
|
||||
pub(in select) fn new() -> Self {
|
||||
PathMap { map: IndexMap::new() }
|
||||
}
|
||||
|
||||
pub fn get_path(&self, v: &RefValueWrapper) -> Option<&String> {
|
||||
self.map.get(v)
|
||||
}
|
||||
|
||||
pub(in select) fn replace(&mut self, v: &RefValueWrapper) {
|
||||
self.map.clear();
|
||||
self.walk("".to_string(), v);
|
||||
}
|
||||
|
||||
fn walk(&mut self, parent_path: String, v: &RefValueWrapper) {
|
||||
if &parent_path == "" {
|
||||
self.map.insert(v.clone(), "/".to_string());
|
||||
} else {
|
||||
self.map.insert(v.clone(), parent_path.clone());
|
||||
}
|
||||
|
||||
match v.deref() {
|
||||
RefValue::Object(map) => {
|
||||
for (key, value) in map {
|
||||
self.walk(format!("{}/{}", &parent_path, key), value);
|
||||
}
|
||||
}
|
||||
RefValue::Array(vec) => {
|
||||
for (index, value) in vec.iter().enumerate() {
|
||||
self.walk(format!("{}/{}", &parent_path, index), value);
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
};
|
||||
}
|
||||
|
||||
pub fn print(&self) {
|
||||
for (k, v) in &self.map {
|
||||
println!("{:?} : {}", k, v);
|
||||
}
|
||||
}
|
||||
}
|
@ -7,9 +7,6 @@ use filter::value_filter::*;
|
||||
use parser::parser::*;
|
||||
use ref_value;
|
||||
use ref_value::model::*;
|
||||
use select::path_map::PathMap;
|
||||
use std::sync::Arc;
|
||||
use std::cell::RefCell;
|
||||
|
||||
/// Utility. Functions like jsonpath::selector or jsonpath::compile are also implemented using this structure.
|
||||
///
|
||||
@ -110,12 +107,11 @@ use std::cell::RefCell;
|
||||
pub struct Selector {
|
||||
pub(crate) node: Option<Node>,
|
||||
pub(crate) value: Option<RefValueWrapper>,
|
||||
path_builder: Arc<RefCell<PathMap>>,
|
||||
}
|
||||
|
||||
impl Selector {
|
||||
pub fn new() -> Self {
|
||||
Selector { node: None, value: None, path_builder: Arc::new(RefCell::new(PathMap::new())) }
|
||||
Selector { node: None, value: None }
|
||||
}
|
||||
|
||||
fn set_value(&mut self, value: RefValueWrapper) {
|
||||
@ -157,8 +153,7 @@ impl Selector {
|
||||
|
||||
fn jf(&self) -> result::Result<JsonValueFilter, String> {
|
||||
match &self.value {
|
||||
Some(v) => Ok(JsonValueFilter::new(v.clone(),
|
||||
self.path_builder.clone())),
|
||||
Some(v) => Ok(JsonValueFilter::new(v.clone())),
|
||||
_ => return Err(SelectorErrorMessage::EmptyValue.to_string())
|
||||
}
|
||||
}
|
||||
@ -194,10 +189,6 @@ impl Selector {
|
||||
serde_json::to_string(self.select()?.deref()).map_err(|e| e.to_string())
|
||||
}
|
||||
|
||||
pub fn select_as_value2(&self) {
|
||||
let _ = &self.select();
|
||||
}
|
||||
|
||||
pub fn select_as_value(&self) -> result::Result<Value, String> {
|
||||
Ok((&self.select()?).into())
|
||||
}
|
||||
@ -212,7 +203,7 @@ impl Selector {
|
||||
match func((&self.select()?).into()).map(|ref v| v.into()) {
|
||||
Some(value) => {
|
||||
self.set_value(value)
|
||||
},
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
Ok(self)
|
||||
|
Reference in New Issue
Block a user