diff --git a/.cargo/config.toml b/.cargo/config.toml index b2ab8e877..8ad453ca8 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -6,3 +6,11 @@ subgraphs = "run --package subgraphs" test_all = "test --workspace" test_qp = "test --package query-planner -- --nocapture" "clippy:fix" = "clippy --all --fix --allow-dirty --allow-staged" + +[build] +rustdocflags = ["-C", "target-cpu=native"] +rustflags = ["-g", "-C", "target-cpu=native"] + +[bench] +rustdocflags = ["-C", "target-cpu=native"] +rustflags = ["-g", "-C", "target-cpu=native"] diff --git a/Cargo.lock b/Cargo.lock index 1859f1020..b840e9f38 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -27,6 +27,19 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "getrandom 0.3.3", + "once_cell", + "version_check", + "zerocopy", +] + [[package]] name = "aho-corasick" version = "1.1.3" @@ -750,6 +763,18 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +[[package]] +name = "faststr" +version = "0.2.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6503af7917fea18ffef8f7e8553fb8dff89e2e6837e94e09dd7fb069c82d62c" +dependencies = [ + "bytes", + "rkyv", + "serde", + "simdutf8", +] + [[package]] name = "fixedbitset" version = "0.5.7" @@ -904,7 +929,7 @@ dependencies = [ "query-plan-executor", "query-planner", "serde", - "serde_json", + "sonic-rs", "thiserror 2.0.12", "tokio", "tower", @@ -1580,6 +1605,26 @@ dependencies = [ "version_check", ] +[[package]] +name = "munge" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cce144fab80fbb74ec5b89d1ca9d41ddf6b644ab7e986f7d3ed0aab31625cb1" +dependencies = [ + "munge_macro", +] + +[[package]] +name = "munge_macro" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "574af9cd5b9971cbfdf535d6a8d533778481b241c447826d976101e0149392a1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "native-tls" version = "0.2.14" @@ -1887,6 +1932,26 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "ptr_meta" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe9e76f66d3f9606f44e45598d155cb13ecf09f4a28199e48daf8c8fc937ea90" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca414edb151b4c8d125c12566ab0d74dc9cdba36fb80eb7b848c15f495fd32d1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "qp-dev-cli" version = "0.0.1" @@ -1913,6 +1978,7 @@ dependencies = [ "reqwest", "serde", "serde_json", + "sonic-rs", "subgraphs", "tokio", "tokio-test", @@ -1931,7 +1997,7 @@ dependencies = [ "lazy_static", "petgraph", "serde", - "serde_json", + "sonic-rs", "thiserror 2.0.12", "tracing", "tracing-subscriber", @@ -1964,6 +2030,15 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +[[package]] +name = "rancor" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caf5f7161924b9d1cea0e4cabc97c372cea92b5f927fc13c6bca67157a0ad947" +dependencies = [ + "ptr_meta", +] + [[package]] name = "rand" version = "0.9.1" @@ -2086,6 +2161,12 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +[[package]] +name = "rend" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a35e8a6bf28cd121053a66aa2e6a2e3eaffad4a60012179f0e864aa5ffeff215" + [[package]] name = "reqwest" version = "0.12.20" @@ -2140,6 +2221,35 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "rkyv" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e147371c75553e1e2fcdb483944a8540b8438c31426279553b9a8182a9b7b65" +dependencies = [ + "bytes", + "hashbrown 0.15.4", + "indexmap 2.9.0", + "munge", + "ptr_meta", + "rancor", + "rend", + "rkyv_derive", + "tinyvec", + "uuid", +] + +[[package]] +name = "rkyv_derive" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "246b40ac189af6c675d124b802e8ef6d5246c53e17367ce9501f8f66a81abb7a" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "rustc-demangle" version = "0.1.25" @@ -2310,7 +2420,6 @@ version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ - "indexmap 2.9.0", "itoa", "memchr", "ryu", @@ -2416,6 +2525,12 @@ dependencies = [ "libc", ] +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + [[package]] name = "similar" version = "2.7.0" @@ -2444,6 +2559,45 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "sonic-number" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8a74044c092f4f43ca7a6cfd62854cf9fb5ac8502b131347c990bf22bef1dfe" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "sonic-rs" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93070f7e7c0d7ec7d08406b1b407234af30420320fd854f304029e3c6db4a899" +dependencies = [ + "ahash", + "bumpalo", + "bytes", + "cfg-if", + "faststr", + "itoa", + "ref-cast", + "ryu", + "serde", + "simdutf8", + "sonic-number", + "sonic-simd", + "thiserror 2.0.12", +] + +[[package]] +name = "sonic-simd" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b421f7b6aa4a5de8f685aaf398dfaa828346ee639d2b1c1061ab43d40baa6223" +dependencies = [ + "cfg-if", +] + [[package]] name = "spin" version = "0.9.8" @@ -2679,6 +2833,21 @@ dependencies = [ "serde_json", ] +[[package]] +name = "tinyvec" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + [[package]] name = "tokio" version = "1.45.1" diff --git a/bench/k6.js b/bench/k6.js index 549a4a399..60aaf80e2 100644 --- a/bench/k6.js +++ b/bench/k6.js @@ -3,12 +3,16 @@ import { check } from "k6"; import { textSummary } from "https://jslib.k6.io/k6-summary/0.0.1/index.js"; import { githubComment } from "https://raw.githubusercontent.com/dotansimha/k6-github-pr-comment/master/lib.js"; +const endpoint = __ENV.GATEWAY_ENDPOINT || "http://0.0.0.0:4000/graphql"; const vus = __ENV.BENCH_VUS ? parseInt(__ENV.BENCH_VUS) : 50; -const time = __ENV.BENCH_OVER_TIME || "30s"; +const duration = __ENV.BENCH_OVER_TIME || "30s"; + +// Apollo: 642.824925/s +// Hive: 832.384019/s export const options = { - vus: vus, - duration: time, + vus, + duration, }; export function setup() { @@ -158,7 +162,7 @@ function handleBenchmarkSummary(data, additionalContext = {}) { function sendGraphQLRequest() { const res = http.post( - __ENV.GATEWAY_ENDPOINT || "http://0.0.0.0:4000/graphql", + endpoint, graphqlRequest.payload, graphqlRequest.params, ); diff --git a/bin/dev-cli/Cargo.toml b/bin/dev-cli/Cargo.toml index 3e5f73875..7e4680a0a 100644 --- a/bin/dev-cli/Cargo.toml +++ b/bin/dev-cli/Cargo.toml @@ -12,4 +12,4 @@ query-planner = { path = "../../lib/query-planner" } graphql-parser = "0.4.1" tracing-subscriber = { version = "0.3.19", features = ["env-filter"] } tracing-tree = "0.4.0" -serde_json = { version = "1.0.120", features = ["preserve_order"] } +serde_json = "1.0.140" diff --git a/bin/gateway/Cargo.toml b/bin/gateway/Cargo.toml index 6ec0db168..365d6373e 100644 --- a/bin/gateway/Cargo.toml +++ b/bin/gateway/Cargo.toml @@ -20,7 +20,7 @@ graphql-tools = "0.4.0" # Using version from original file # Serialization serde = { version = "1.0.203", features = ["derive"] } -serde_json = { version = "1.0.120", features = ["preserve_order"] } +sonic-rs = "0.5.1" # HTTP client and caching moka = { version = "0.12.8", features = ["future"] } diff --git a/bin/gateway/src/pipeline/coerce_variables_service.rs b/bin/gateway/src/pipeline/coerce_variables_service.rs index 68c1ba3d0..8a59b79e1 100644 --- a/bin/gateway/src/pipeline/coerce_variables_service.rs +++ b/bin/gateway/src/pipeline/coerce_variables_service.rs @@ -5,7 +5,7 @@ use axum::body::Body; use http::Request; use query_plan_executor::variables::collect_variables; use query_plan_executor::ExecutionRequest; -use serde_json::Value; +use sonic_rs::Value; use tracing::{trace, warn}; use crate::pipeline::error::{PipelineError, PipelineErrorVariant}; diff --git a/bin/gateway/src/pipeline/error.rs b/bin/gateway/src/pipeline/error.rs index 1723d60a6..245731e64 100644 --- a/bin/gateway/src/pipeline/error.rs +++ b/bin/gateway/src/pipeline/error.rs @@ -5,7 +5,7 @@ use graphql_tools::validation::utils::ValidationError; use http::{Response, StatusCode}; use query_plan_executor::{ExecutionResult, GraphQLError}; use query_planner::{ast::normalization::error::NormalizationError, planner::PlannerError}; -use serde_json::Value; +use sonic_rs::Value; use crate::pipeline::http_request_params::APPLICATION_JSON; @@ -55,11 +55,11 @@ pub enum PipelineErrorVariant { // GraphQL-specific errors #[error("Failed to parse GraphQL request payload")] - FailedToParseBody(serde_json::Error), + FailedToParseBody(sonic_rs::Error), #[error("Failed to parse GraphQL variables JSON")] - FailedToParseVariables(serde_json::Error), + FailedToParseVariables(sonic_rs::Error), #[error("Failed to parse GraphQL extensions JSON")] - FailedToParseExtensions(serde_json::Error), + FailedToParseExtensions(sonic_rs::Error), #[error("Failed to parse GraphQL operation")] FailedToParseOperation(graphql_parser::query::ParseError), #[error("Failed to normalize GraphQL operation")] @@ -149,7 +149,7 @@ impl IntoResponse for PipelineError { return ( StatusCode::OK, - serde_json::to_string(&validation_error_result).unwrap(), + sonic_rs::to_string(&validation_error_result).unwrap(), ) .into_response(); } @@ -158,10 +158,7 @@ impl IntoResponse for PipelineError { let message = self.error.graphql_error_message(); let graphql_error = GraphQLError { - extensions: Some(HashMap::from([( - "code".to_string(), - Value::String(code.to_string()), - )])), + extensions: Some(HashMap::from([("code".to_string(), Value::from(code))])), message, path: None, locations: None, @@ -173,6 +170,6 @@ impl IntoResponse for PipelineError { extensions: None, }; - (status, serde_json::to_string(&result).unwrap()).into_response() + (status, sonic_rs::to_string(&result).unwrap()).into_response() } } diff --git a/bin/gateway/src/pipeline/execution_service.rs b/bin/gateway/src/pipeline/execution_service.rs index ed3a1cf09..d3605b86c 100644 --- a/bin/gateway/src/pipeline/execution_service.rs +++ b/bin/gateway/src/pipeline/execution_service.rs @@ -1,4 +1,3 @@ -use std::collections::HashMap; use std::convert::Infallible; use std::future::Future; use std::pin::Pin; @@ -11,12 +10,9 @@ use crate::pipeline::normalize_service::GraphQLNormalizationPayload; use crate::pipeline::query_plan_service::QueryPlanPayload; use crate::shared_state::GatewaySharedState; use axum::body::Body; -use axum::response::IntoResponse; -use axum::Json; use http::header::CONTENT_TYPE; use http::{Request, Response}; use query_plan_executor::execute_query_plan; -use serde_json::to_value; use tower::Service; #[derive(Clone, Debug, Default)] @@ -66,26 +62,18 @@ impl Service> for ExecutionService { .get::() .expect("HttpRequestParams missing"); - let mut execution_result = execute_query_plan( + let execution_result = execute_query_plan( &query_plan_payload.query_plan, &app_state.subgraph_executor_map, &variable_payload.variables_map, &app_state.schema_metadata, &normalized_payload.normalized_document.operation, normalized_payload.has_introspection, + expose_query_plan, ) .await; - if expose_query_plan { - let plan_value = to_value(query_plan_payload.query_plan.as_ref()).unwrap(); - - execution_result - .extensions - .get_or_insert_with(HashMap::new) - .insert("queryPlan".to_string(), plan_value); - } - - let mut response = Json(execution_result).into_response(); + let mut response = Response::new(Body::from(execution_result)); response.headers_mut().insert( CONTENT_TYPE, http_request_params.response_content_type.clone(), diff --git a/bin/gateway/src/pipeline/graphql_request_params.rs b/bin/gateway/src/pipeline/graphql_request_params.rs index 9f92edef1..27f3e344b 100644 --- a/bin/gateway/src/pipeline/graphql_request_params.rs +++ b/bin/gateway/src/pipeline/graphql_request_params.rs @@ -34,7 +34,7 @@ impl TryInto for GETQueryParams { }; let variables = match self.variables.as_deref() { - Some(v_str) if !v_str.is_empty() => match serde_json::from_str(v_str) { + Some(v_str) if !v_str.is_empty() => match sonic_rs::from_str(v_str) { Ok(vars) => Some(vars), Err(e) => { return Err(PipelineErrorVariant::FailedToParseVariables(e)); @@ -44,7 +44,7 @@ impl TryInto for GETQueryParams { }; let extensions = match self.extensions.as_deref() { - Some(e_str) if !e_str.is_empty() => match serde_json::from_str(e_str) { + Some(e_str) if !e_str.is_empty() => match sonic_rs::from_str(e_str) { Ok(exts) => Some(exts), Err(e) => { return Err(PipelineErrorVariant::FailedToParseExtensions(e)); @@ -58,6 +58,7 @@ impl TryInto for GETQueryParams { operation_name: self.operation_name, variables, extensions, + representations: None, }; Ok(execution_request) @@ -127,7 +128,7 @@ impl GatewayPipelineLayer for GraphQLRequestParamsExtractor { ) })?; - let execution_request = serde_json::from_slice::(&body_bytes) + let execution_request = sonic_rs::from_slice::(&body_bytes) .map_err(|e| { warn!("Failed to parse body: {}", e); diff --git a/lib/query-plan-executor/Cargo.toml b/lib/query-plan-executor/Cargo.toml index 1412c4ac7..09873be3b 100644 --- a/lib/query-plan-executor/Cargo.toml +++ b/lib/query-plan-executor/Cargo.toml @@ -8,7 +8,8 @@ edition = "2021" [dependencies] async-trait = "0.1" serde = "1.0.219" -serde_json = { version = "1.0.140", features = ["preserve_order"] } +serde_json = { version = "1.0.140" } +sonic-rs = "0.5.1" futures = "0.3" reqwest = { version = "0.12", features = ["json"] } query-planner = { path = "../query-planner" } diff --git a/lib/query-plan-executor/benches/executor_benches.rs b/lib/query-plan-executor/benches/executor_benches.rs index 23a3a7af6..e8c8ab083 100644 --- a/lib/query-plan-executor/benches/executor_benches.rs +++ b/lib/query-plan-executor/benches/executor_benches.rs @@ -54,6 +54,7 @@ fn query_plan_executor_pipeline_via_http(c: &mut Criterion) { schema_metadata, operation, has_introspection, + false, ) .await; black_box(result) @@ -143,6 +144,7 @@ fn query_plan_executor_pipeline_locally(c: &mut Criterion) { schema_metadata, operation, has_introspection, + false, ) .await; black_box(result) @@ -221,16 +223,19 @@ fn project_data_by_operation(c: &mut Criterion) { let data = black_box(&mut data); let mut errors = vec![]; let errors = black_box(&mut errors); + let extensions = HashMap::new(); + let extensions = black_box(&extensions); let operation = black_box(&operation); let schema_metadata = black_box(&schema_metadata); - query_plan_executor::project_data_by_operation( + let result = query_plan_executor::projection::project_by_operation( data, errors, + extensions, operation, schema_metadata, &None, ); - black_box(()); + black_box(result); }); }); } @@ -246,8 +251,12 @@ fn traverse_and_collect(c: &mut Criterion) { let result = black_box(&mut result); let data = result.get_mut("data").unwrap(); let path = black_box(&path); - let result = query_plan_executor::traverse_and_collect(data, path); - black_box(result); + let mut results = vec![]; + query_plan_executor::traverse_and_callback(data, path, &mut |data| { + results.push(data); + }); + black_box(()); + black_box(results); }); }); } @@ -328,7 +337,10 @@ fn project_requires(c: &mut Criterion) { ]; let mut result: Value = non_projected_result::get_result(); let data = result.get_mut("data").unwrap(); - let representations = query_plan_executor::traverse_and_collect(data, &path); + let mut representations = vec![]; + query_plan_executor::traverse_and_callback(data, &path, &mut |data| { + representations.push(data); + }); let supergraph_sdl = std::fs::read_to_string("../../bench/supergraph.graphql") .expect("Unable to read input file"); let parsed_schema = parse_schema(&supergraph_sdl); @@ -396,11 +408,22 @@ fn project_requires(c: &mut Criterion) { c.bench_function("project_requires", |b| { b.iter(|| { let execution_context = black_box(&execution_context); + let mut buffer = String::with_capacity(1024); + let mut first = true; for representation in black_box(&representations) { - let requires = - execution_context.project_requires(&requires_selections, representation); + let requires = execution_context.project_requires( + &requires_selections, + representation, + &mut buffer, + first, + None, + ); + if requires { + first = false; + } black_box(requires); } + black_box(buffer) }); }); } @@ -442,16 +465,17 @@ fn deep_merge_with_simple(c: &mut Criterion) { } fn all_benchmarks(c: &mut Criterion) { - deep_merge_with_simple(c); - deep_merge_with_complex(c); - project_requires(c); - traverse_and_collect(c); - project_data_by_operation(c); query_plan_executor_without_projection_locally(c); query_plan_executor_pipeline_locally(c); query_plan_execution_without_projection_via_http(c); query_plan_executor_pipeline_via_http(c); + + deep_merge_with_simple(c); + deep_merge_with_complex(c); + project_requires(c); + traverse_and_collect(c); + project_data_by_operation(c); } criterion_group!(benches, all_benchmarks); diff --git a/lib/query-plan-executor/src/deep_merge.rs b/lib/query-plan-executor/src/deep_merge.rs index d5c5e56f2..7ec31728b 100644 --- a/lib/query-plan-executor/src/deep_merge.rs +++ b/lib/query-plan-executor/src/deep_merge.rs @@ -1,58 +1,34 @@ -use serde_json::Value; +use sonic_rs::{JsonContainerTrait, JsonValueMutTrait, JsonValueTrait, Value}; use tracing::{instrument, trace}; // Deeply merges two serde_json::Values (mutates target in place) #[instrument(level = "trace", name = "deep_merge", skip_all)] pub fn deep_merge(target: &mut Value, source: Value) { - match (target, source) { - (_, Value::Null) => { - trace!("Source is Null, keeping target as is"); - } - - (Value::Object(target_map), Value::Object(source_map)) => { - trace!( - "Merging two objects: target_map_len={}, source_map_len={}", - target_map.len(), - source_map.len() - ); - deep_merge_objects(target_map, source_map); - } + if source.is_null() { + trace!("Source is Null, keeping target as is"); + return; + } - // 3. Both are Arrays of same length(?): Merge elements - (Value::Array(target_arr), Value::Array(source_arr)) => { - trace!( - "Merging two arrays: target_arr_len={}, source_arr_len={}", - target_arr.len(), - source_arr.len() - ); - for (target_val, source_val) in target_arr.iter_mut().zip(source_arr) { - deep_merge(target_val, source_val); - } - } + if target.is_object() && source.is_object() { + return deep_merge_objects( + target.as_object_mut().unwrap(), + source.as_object().unwrap().to_owned(), + ); + } - // 4. Fallback: Source is not Null, and cases 2 & 3 didn't match. Replace target with source. - (target_val, source) => { - trace!( - "Replacing target value with source value: target_val={}, source={}", - target_val, - source - ); - // source is guaranteed not Null here due to arm 1 - *target_val = source; + if target.is_array() && source.is_array() { + let target_arr = target.as_array_mut().unwrap(); + let source_arr = source.as_array().unwrap(); + for (target_val, source_val) in target_arr.iter_mut().zip(source_arr) { + deep_merge(target_val, source_val.to_owned()); } + return; } + + *target = source; } -#[instrument( - level = "trace", - name = "deep_merge_objects", - skip_all, - fields(target_map_len = target_map.len(), source_map_len = source_map.len(), typename= %target_map.get("typename").and_then(|a| a.as_str()).unwrap_or("unknown")) -)] -pub fn deep_merge_objects( - target_map: &mut serde_json::Map, - source_map: serde_json::Map, -) { +pub fn deep_merge_objects(target_map: &mut sonic_rs::Object, source_map: sonic_rs::Object) { if target_map.is_empty() { // If target is empty, just replace it with source trace!("Target map is empty, replacing with source map"); @@ -69,15 +45,15 @@ pub fn deep_merge_objects( target_map.len(), source_map.len() ); - for (key, source_val) in source_map { + for (key, source_val) in source_map.iter() { if let Some(target_val) = target_map.get_mut(&key) { // If key exists in target, merge recursively trace!("Key '{}' exists in target, merging values", key); - deep_merge(target_val, source_val); + deep_merge(target_val, source_val.to_owned()); } else { trace!("Key '{}' does not exist in target, inserting value", key); // If key does not exist in target, insert it - target_map.insert(key, source_val); + target_map.insert(key, source_val.to_owned()); } } } diff --git a/lib/query-plan-executor/src/executors/async_graphql.rs b/lib/query-plan-executor/src/executors/async_graphql.rs index 07f3aab18..763cabf3a 100644 --- a/lib/query-plan-executor/src/executors/async_graphql.rs +++ b/lib/query-plan-executor/src/executors/async_graphql.rs @@ -2,6 +2,7 @@ use std::collections::HashMap; use async_trait::async_trait; use serde_json::json; +use sonic_rs::{json as sonic_json, JsonContainerTrait, Value as SonicValue} use crate::{ executors::common::SubgraphExecutor, ExecutionRequest, ExecutionResult, GraphQLError, @@ -25,6 +26,15 @@ impl From for async_graphql::Request { if let Some(variables) = exec_request.variables { req = req.variables(async_graphql::Variables::from_json(json!(variables))); } + if let Some(representations) = exec_request.representations { + req.variables.insert( + async_graphql::Name::new("representations"), + async_graphql::Value::from_json( + sonic_rs::from_str(&representations).unwrap_or_default(), + ) + .unwrap(), + ); + } if let Some(operation_name) = exec_request.operation_name { req = req.operation_name(operation_name); } @@ -32,7 +42,8 @@ impl From for async_graphql::Request { for (key, value) in extensions { req.extensions.insert( key, - async_graphql::Value::from_json(value).unwrap_or_default(), + async_graphql::Value::from_json(json!(sonic_rs::to_string(value))) + .unwrap_or_default(), ); } } @@ -59,23 +70,21 @@ impl From<&async_graphql::ServerError> for GraphQLError { .path .iter() .map(|s| match s { - async_graphql::PathSegment::Field(name) => { - serde_json::Value::String(name.to_string()) - } + async_graphql::PathSegment::Field(name) => SonicValue::from(name), async_graphql::PathSegment::Index(index) => { - serde_json::Value::Number((*index).into()) + SonicValue::from(*index) } }) .collect(), ), extensions: error.extensions.as_ref().map(|ext| { - let serialized = json!(ext); + let serialized = sonic_json!(ext); serialized .as_object() .unwrap() .iter() .map(|(k, v)| (k.to_string(), v.clone())) - .collect::>() + .collect::>() }), } } @@ -84,7 +93,7 @@ impl From<&async_graphql::ServerError> for GraphQLError { impl From for ExecutionResult { fn from(response: async_graphql::Response) -> Self { ExecutionResult { - data: Some(response.data.into_json().unwrap()), + data: Some(sonic_json!(serde_json::to_string(response.data.into_json().unwrap()))), errors: Some( response .errors @@ -97,7 +106,7 @@ impl From for ExecutionResult { .extensions .into_iter() .map(|(key, value)| (key, value.into_json().unwrap())) - .collect::>(), + .collect::>(), ), } } diff --git a/lib/query-plan-executor/src/executors/http.rs b/lib/query-plan-executor/src/executors/http.rs index 2d5923e12..882114732 100644 --- a/lib/query-plan-executor/src/executors/http.rs +++ b/lib/query-plan-executor/src/executors/http.rs @@ -22,13 +22,43 @@ impl HTTPSubgraphExecutor { execution_request: ExecutionRequest, ) -> Result { trace!("Executing HTTP request to subgraph at {}", self.endpoint); - self.http_client + + // TODO: decrease allocations here + let mut body = "{\"query\":".to_string() + + &sonic_rs::to_string(&execution_request.query).unwrap() + + ",\"variables\":{"; + let variables_added = false; + if let Some(variables) = &execution_request.variables { + let variables_entry = variables + .iter() + .map(|(key, value)| { + "\"".to_string() + key + "\": " + &sonic_rs::to_string(value).unwrap() + }) + .collect::>() + .join(","); + body.push_str(&variables_entry); + } + if let Some(representations) = &execution_request.representations { + if variables_added { + body.push(','); + } + body.push_str(&("\"representations\":".to_string() + representations)); + } + body.push_str("}}"); + + let response = self + .http_client .post(&self.endpoint) - .json(&execution_request) + .body(body) + .header("Content-Type", "application/json; charset=utf-8") .send() - .await? - .json::() - .await + .await?; + + let response_bytes = response.bytes().await?; + let execution_result = + sonic_rs::from_slice::(&response_bytes).expect("parse(response)"); + + Ok(execution_result) } } diff --git a/lib/query-plan-executor/src/executors/mod.rs b/lib/query-plan-executor/src/executors/mod.rs index 546a77338..b37a7b926 100644 --- a/lib/query-plan-executor/src/executors/mod.rs +++ b/lib/query-plan-executor/src/executors/mod.rs @@ -3,4 +3,4 @@ pub mod http; pub mod map; // TODO: We can't enable this because benchmarks use it #[cfg(test)] -pub mod async_graphql; +// pub mod async_graphql; diff --git a/lib/query-plan-executor/src/json_writer.rs b/lib/query-plan-executor/src/json_writer.rs new file mode 100644 index 000000000..b2e9dcdeb --- /dev/null +++ b/lib/query-plan-executor/src/json_writer.rs @@ -0,0 +1,80 @@ +//! I took it from https://github.com/zotta/json-writer-rs/blob/f45e2f25cede0e06be76a94f6e45608780a835d4/src/lib.rs#L853 + +const fn get_replacements() -> [u8; 256] { + // NOTE: Only characters smaller than 128 are allowed here. + // Trying to escape values above 128 would generate invalid utf-8 output + // ----- + // see https://www.json.org/json-en.html + let mut result = [0u8; 256]; + // Escape everything from 0 to 0x1F + let mut i = 0; + while i < 0x20 { + result[i] = b'u'; + i += 1; + } + result[b'\"' as usize] = b'"'; + result[b'\\' as usize] = b'\\'; + result[b'/' as usize] = b'/'; + result[8] = b'b'; + result[0xc] = b'f'; + result[b'\n' as usize] = b'n'; + result[b'\r' as usize] = b'r'; + result[b'\t' as usize] = b't'; + result[0] = b'u'; + + result +} + +static REPLACEMENTS: [u8; 256] = get_replacements(); +static HEX: [u8; 16] = *b"0123456789ABCDEF"; + +/// Escapes and append part of string +#[inline(always)] +pub fn write_and_escape_string(output_buffer: &mut String, input: &str) { + output_buffer.push('"'); + + // All of the relevant characters are in the ansi range (<128). + // This means we can safely ignore any utf-8 characters and iterate over the bytes directly + let mut num_bytes_written: usize = 0; + let mut index: usize = 0; + let bytes = input.as_bytes(); + while index < bytes.len() { + let cur_byte = bytes[index]; + let replacement = REPLACEMENTS[cur_byte as usize]; + if replacement != 0 { + if num_bytes_written < index { + // Checks can be omitted here: + // We know that index is smaller than the output_buffer length. + // We also know that num_bytes_written is smaller than index + // We also know that the boundaries are not in the middle of an utf-8 multi byte sequence, because those characters are not escaped + output_buffer.push_str(unsafe { input.get_unchecked(num_bytes_written..index) }); + } + if replacement == b'u' { + let bytes: [u8; 6] = [ + b'\\', + b'u', + b'0', + b'0', + HEX[((cur_byte / 16) & 0xF) as usize], + HEX[(cur_byte & 0xF) as usize], + ]; + // Checks can be omitted here: We know bytes is a valid utf-8 string (see above) + output_buffer.push_str(unsafe { std::str::from_utf8_unchecked(&bytes) }); + } else { + let bytes: [u8; 2] = [b'\\', replacement]; + // Checks can be omitted here: We know bytes is a valid utf-8 string, because the replacement table only contains characters smaller than 128 + output_buffer.push_str(unsafe { std::str::from_utf8_unchecked(&bytes) }); + } + num_bytes_written = index + 1; + } + index += 1; + } + if num_bytes_written < bytes.len() { + // Checks can be omitted here: + // We know that num_bytes_written is smaller than index + // We also know that num_bytes_written not in the middle of an utf-8 multi byte sequence, because those are not escaped + output_buffer.push_str(unsafe { input.get_unchecked(num_bytes_written..bytes.len()) }); + } + + output_buffer.push('"'); +} diff --git a/lib/query-plan-executor/src/lib.rs b/lib/query-plan-executor/src/lib.rs index c844a2c07..ceee6aaf5 100644 --- a/lib/query-plan-executor/src/lib.rs +++ b/lib/query-plan-executor/src/lib.rs @@ -1,26 +1,27 @@ use async_trait::async_trait; use query_planner::{ - ast::{ - operation::OperationDefinition, selection_item::SelectionItem, selection_set::SelectionSet, - }, + ast::{operation::OperationDefinition, selection_item::SelectionItem}, planner::plan_nodes::{ ConditionNode, FetchNode, FetchRewrite, FlattenNode, KeyRenamer, ParallelNode, PlanNode, QueryPlan, SequenceNode, ValueSetter, }, - state::supergraph_state::OperationKind, }; use serde::{Deserialize, Serialize}; -use serde_json::{Map, Value}; +use sonic_rs::{JsonContainerTrait, JsonValueMutTrait, JsonValueTrait, Value}; +use std::collections::HashSet; +use std::{collections::BTreeSet, fmt::Write}; use std::{collections::HashMap, vec}; use tracing::{instrument, trace, warn}; // For reading file in main use crate::{ - deep_merge::deep_merge_objects, executors::map::SubgraphExecutorMap, + executors::map::SubgraphExecutorMap, json_writer::write_and_escape_string, schema_metadata::SchemaMetadata, }; pub mod deep_merge; pub mod executors; pub mod introspection; +mod json_writer; +pub mod projection; pub mod schema_metadata; pub mod validation; mod value_from_ast; @@ -95,42 +96,9 @@ fn process_errors_and_extensions( execution_context.extensions.extend(extensions); } } - -#[instrument( - level = "debug", - skip_all - name = "process_representations_result", - fields( - representations_count = %result.entities.as_ref().map_or(0, |e| e.len()) - ), -)] -fn process_representations_result( - result: ExecuteForRepresentationsResult, - representations: &mut Vec<&mut Value>, - execution_context: &mut QueryPlanExecutionContext<'_>, -) { - if let Some(entities) = result.entities { - trace!( - "Processing representations result: {} entities", - entities.len() - ); - for (entity, index) in entities.into_iter().zip(result.indexes.into_iter()) { - if let Some(representation) = representations.get_mut(index) { - trace!( - "Merging entity into representation at index {}: {:?}", - index, - entity - ); - deep_merge::deep_merge(representation, entity); - } - } - } - process_errors_and_extensions(execution_context, result.errors, result.extensions); -} - struct ExecuteForRepresentationsResult { entities: Option>, - indexes: Vec, + indexes: BTreeSet, errors: Option>, extensions: Option>, } @@ -141,20 +109,15 @@ trait ExecutableFetchNode { &self, execution_context: &QueryPlanExecutionContext<'_>, ) -> ExecutionResult; - fn project_representations( - &self, - execution_context: &QueryPlanExecutionContext<'_>, - representations: &[&mut Value], - ) -> ProjectRepresentationsResult; async fn execute_for_projected_representations( &self, execution_context: &QueryPlanExecutionContext<'_>, - filtered_representations: Vec, - filtered_repr_indexes: Vec, + filtered_representations: String, + indexes: BTreeSet, ) -> ExecuteForRepresentationsResult; fn apply_output_rewrites( &self, - possible_types: &HashMap>, + possible_types: &HashMap>, data: &mut Value, ); fn prepare_variables_for_fetch_node( @@ -177,15 +140,10 @@ impl ExecutablePlanNode for FetchNode { } } -struct ProjectRepresentationsResult { - representations: Vec, - indexes: Vec, -} - #[async_trait] impl ExecutableFetchNode for FetchNode { #[instrument( - level = "trace", + level = "trace", skip_all, name="FetchNode::execute_for_root", fields( @@ -205,6 +163,7 @@ impl ExecutableFetchNode for FetchNode { operation_name: self.operation_name.clone(), variables, extensions: None, + representations: None, }; let mut fetch_result = execution_context .subgraph_executor_map @@ -220,43 +179,8 @@ impl ExecutableFetchNode for FetchNode { fetch_result } - fn project_representations( - &self, - execution_context: &QueryPlanExecutionContext<'_>, - representations: &[&mut Value], - ) -> ProjectRepresentationsResult { - let mut filtered_repr_indexes = Vec::new(); - // 1. Filter representations based on requires (if present) - let mut filtered_representations: Vec = Vec::new(); - let requires_nodes = self.requires.as_ref().unwrap(); - for (index, entity) in representations.iter().enumerate() { - let entity_projected = - execution_context.project_requires(&requires_nodes.items, entity); - if !entity_projected.is_null() { - filtered_representations.push(entity_projected); - filtered_repr_indexes.push(index); - } - } - - if let Some(input_rewrites) = &self.input_rewrites { - for representation in filtered_representations.iter_mut() { - for rewrite in input_rewrites { - rewrite.apply( - &execution_context.schema_metadata.possible_types, - representation, - ); - } - } - } - - ProjectRepresentationsResult { - representations: filtered_representations, - indexes: filtered_repr_indexes, - } - } - #[instrument( - level = "debug", + level = "debug", skip_all, name = "execute_for_projected_representations", fields( @@ -266,23 +190,16 @@ impl ExecutableFetchNode for FetchNode { async fn execute_for_projected_representations( &self, execution_context: &QueryPlanExecutionContext<'_>, - filtered_representations: Vec, - filtered_repr_indexes: Vec, + filtered_representations: String, + indexes: BTreeSet, ) -> ExecuteForRepresentationsResult { // 2. Prepare variables for fetch - let mut variables = self - .prepare_variables_for_fetch_node(execution_context.variable_values) - .unwrap_or_default(); - variables.insert( - "representations".to_string(), - Value::Array(filtered_representations), - ); - let execution_request = ExecutionRequest { query: self.operation.operation_str.clone(), operation_name: self.operation_name.clone(), - variables: Some(variables), + variables: self.prepare_variables_for_fetch_node(execution_context.variable_values), extensions: None, + representations: Some(filtered_representations), }; // 3. Execute the fetch operation @@ -297,19 +214,22 @@ impl ExecutableFetchNode for FetchNode { &execution_context.schema_metadata.possible_types, &mut data, ); - match data { - Value::Object(mut obj) => match obj.remove("_entities") { - Some(Value::Array(arr)) => Some(arr), - _ => None, // If _entities is not found or not an array - }, - _ => None, // If data is not an object + match data.as_object_mut() { + Some(obj) => { + if let Some(val) = obj.remove(&"_entities").as_array() { + Some(val.to_vec()) + } else { + None // If _entities is not found or not an array + } + } + None => None, // If data is not an object } } else { None }; ExecuteForRepresentationsResult { entities, - indexes: filtered_repr_indexes, + indexes, errors: fetch_result.errors, extensions: fetch_result.extensions, } @@ -317,7 +237,7 @@ impl ExecutableFetchNode for FetchNode { fn apply_output_rewrites( &self, - possible_types: &HashMap>, + possible_types: &HashMap>, data: &mut Value, ) { if let Some(output_rewrites) = &self.output_rewrites { @@ -359,17 +279,17 @@ impl ExecutableFetchNode for FetchNode { } trait ApplyFetchRewrite { - fn apply(&self, possible_types: &HashMap>, value: &mut Value); + fn apply(&self, possible_types: &HashMap>, value: &mut Value); fn apply_path( &self, - possible_types: &HashMap>, + possible_types: &HashMap>, value: &mut Value, path: &[String], ); } impl ApplyFetchRewrite for FetchRewrite { - fn apply(&self, possible_types: &HashMap>, value: &mut Value) { + fn apply(&self, possible_types: &HashMap>, value: &mut Value) { match self { FetchRewrite::KeyRenamer(renamer) => renamer.apply(possible_types, value), FetchRewrite::ValueSetter(setter) => setter.apply(possible_types, value), @@ -377,7 +297,7 @@ impl ApplyFetchRewrite for FetchRewrite { } fn apply_path( &self, - possible_types: &HashMap>, + possible_types: &HashMap>, value: &mut Value, path: &[String], ) { @@ -389,68 +309,71 @@ impl ApplyFetchRewrite for FetchRewrite { } impl ApplyFetchRewrite for KeyRenamer { - fn apply(&self, possible_types: &HashMap>, value: &mut Value) { + fn apply(&self, possible_types: &HashMap>, value: &mut Value) { self.apply_path(possible_types, value, &self.path) } // Applies key rename operation on a Value (mutably) fn apply_path( &self, - possible_types: &HashMap>, + possible_types: &HashMap>, value: &mut Value, path: &[String], ) { let current_segment = &path[0]; let remaining_path = &path[1..]; - match value { - Value::Array(arr) => { - for item in arr { - self.apply_path(possible_types, item, path); - } + if let Some(arr) = value.as_array_mut() { + for item in arr { + self.apply_path(possible_types, item, path); } - Value::Object(obj) => { - let type_condition = current_segment.strip_prefix("... on "); - match type_condition { - Some(type_condition) => { - let type_name = match obj.get(TYPENAME_FIELD) { - Some(Value::String(type_name)) => type_name, - _ => type_condition, // Default to type_condition if not found - }; - if entity_satisfies_type_condition( - possible_types, - type_name, - type_condition, - ) { - self.apply_path(possible_types, value, remaining_path) - } + return; + } + + if let Some(obj) = value.as_object_mut() { + let type_condition = current_segment.strip_prefix("... on "); + match type_condition { + Some(type_condition) => { + let type_name_from_entity = + obj.get(&TYPENAME_FIELD).and_then(sonic_rs::Value::as_str); + let type_name = match type_name_from_entity { + Some(tn_str) => tn_str, + None => type_condition, + }; + let satisfies_type_condition = type_name == type_condition + || possible_types + .get(type_name) + .is_some_and(|s| s.contains(type_condition)); + if satisfies_type_condition { + self.apply_path(possible_types, value, remaining_path) } - _ => { - if remaining_path.is_empty() { - if *current_segment != self.rename_key_to { - if let Some(val) = obj.remove(current_segment) { - obj.insert(self.rename_key_to.to_string(), val); - } + } + _ => { + if remaining_path.is_empty() { + if *current_segment != self.rename_key_to { + if let Some(val) = obj.remove(current_segment) { + obj.insert(&self.rename_key_to, val); } - } else if let Some(next_value) = obj.get_mut(current_segment) { - self.apply_path(possible_types, next_value, remaining_path) } + } else if let Some(next_value) = obj.get_mut(current_segment) { + self.apply_path(possible_types, next_value, remaining_path) } } } - _ => (), } + + () } } impl ApplyFetchRewrite for ValueSetter { - fn apply(&self, possible_types: &HashMap>, data: &mut Value) { + fn apply(&self, possible_types: &HashMap>, data: &mut Value) { self.apply_path(possible_types, data, &self.path) } // Applies value setting on a Value (returns a new Value) fn apply_path( &self, - possible_types: &HashMap>, + possible_types: &HashMap>, data: &mut Value, path: &[String], ) { @@ -459,37 +382,45 @@ impl ApplyFetchRewrite for ValueSetter { return; } - match data { - Value::Array(arr) => { - for data in arr { - // Apply the path to each item in the array - self.apply_path(possible_types, data, path); - } + if let Some(arr) = data.as_array_mut() { + for data in arr { + // Apply the path to each item in the array + self.apply_path(possible_types, data, path); } - Value::Object(map) => { - let current_key = &path[0]; - let remaining_path = &path[1..]; - - if let Some(type_condition) = current_key.strip_prefix("... on ") { - let type_name = match map.get(TYPENAME_FIELD) { - Some(Value::String(type_name)) => type_name, - _ => type_condition, // Default to type_condition if not found - }; - if entity_satisfies_type_condition(possible_types, type_name, type_condition) { - self.apply_path(possible_types, data, remaining_path) - } - } else if let Some(data) = map.get_mut(current_key) { - // If the key exists, apply the remaining path to its value + return; + } + + if let Some(obj) = data.as_object_mut() { + let current_key = &path[0]; + let remaining_path = &path[1..]; + + if let Some(type_condition) = current_key.strip_prefix("... on ") { + let type_name_from_entity = + obj.get(&TYPENAME_FIELD).and_then(sonic_rs::Value::as_str); + + let type_name = match type_name_from_entity { + Some(tn_str) => tn_str, + None => type_condition, + }; + let satisfies_type_condition = type_name == type_condition + || possible_types + .get(type_name) + .is_some_and(|s| s.contains(type_condition)); + if satisfies_type_condition { self.apply_path(possible_types, data, remaining_path) } + } else if let Some(data) = obj.get_mut(current_key) { + // If the key exists, apply the remaining path to its value + self.apply_path(possible_types, data, remaining_path) } - _ => { - warn!( - "Trying to apply ValueSetter path {:?} to non-object/array type: {:?}", - path, data - ); - } + + return; } + + warn!( + "Trying to apply ValueSetter path {:?} to non-object/array type: {:?}", + path, data + ); } } @@ -562,7 +493,7 @@ impl ExecutablePlanNode for ParallelNode { PlanNode::Flatten(flatten_node) => { let normalized_path: Vec<&str> = flatten_node.path.iter().map(String::as_str).collect(); - let collected_representations = traverse_and_collect(data, &normalized_path); + let mut representations = String::with_capacity(1024); let fetch_node = match flatten_node.node.as_ref() { PlanNode::Fetch(fetch_node) => fetch_node, _ => { @@ -573,12 +504,28 @@ impl ExecutablePlanNode for ParallelNode { continue; // Skip if the child node is not a FetchNode } }; - let project_result = fetch_node - .project_representations(execution_context, &collected_representations); + let requires_nodes = fetch_node.requires.as_ref().unwrap(); + let mut index = 0; + let mut indexes = BTreeSet::new(); + representations.push('['); + traverse_and_callback(data, &normalized_path, &mut |entity| { + let is_projected = execution_context.project_requires( + &requires_nodes.items, + entity, + &mut representations, + indexes.is_empty(), + None, + ); + if is_projected { + indexes.insert(index); + } + index += 1; + }); + representations.push(']'); let job = fetch_node.execute_for_projected_representations( execution_context, - project_result.representations, - project_result.indexes, + representations, + indexes, ); flatten_jobs.push(job); flatten_paths.push(normalized_path); @@ -610,14 +557,18 @@ impl ExecutablePlanNode for ParallelNode { let now = std::time::Instant::now(); for (result, path) in flatten_results.into_iter().zip(flatten_paths) { // Process FlattenNode results - if let Some(entities) = result.entities { - let mut collected_representations = traverse_and_collect(data, &path); - for (entity, index) in entities.into_iter().zip(result.indexes.into_iter()) { - if let Some(representation) = collected_representations.get_mut(index) { - // Merge the entity into the representation - deep_merge::deep_merge(representation, entity); + if let Some(mut entities) = result.entities { + let mut index_of_traverse = 0; + let mut index_of_entities = 0; + traverse_and_callback(data, &path, &mut |target| { + if result.indexes.contains(&index_of_traverse) { + let entity = entities.get_mut(index_of_entities).unwrap().take(); + // Merge the entity into the target + deep_merge::deep_merge(target, entity); + index_of_entities += 1; } - } + index_of_traverse += 1; + }); } // Extend errors and extensions from the result if let Some(errors) = result.errors { @@ -681,51 +632,51 @@ impl ExecutablePlanNode for FlattenNode { // because `collected_representations` borrows `data_for_flatten`, not `execution_context.data`. let normalized_path: Vec<&str> = self.path.iter().map(String::as_str).collect(); let now = std::time::Instant::now(); - let mut representations = traverse_and_collect(data, normalized_path.as_slice()); + let mut representations = vec![]; + let mut filtered_representations = String::with_capacity(1024); + let fetch_node = match self.node.as_ref() { + PlanNode::Fetch(fetch_node) => fetch_node, + _ => { + warn!( + "FlattenNode can only execute FetchNode as child node, found: {:?}", + self.node + ); + return; // Skip if the child node is not a FetchNode + } + }; + let requires_nodes = fetch_node.requires.as_ref().unwrap(); + filtered_representations.push('['); + let mut first = true; + traverse_and_callback(data, normalized_path.as_slice(), &mut |entity| { + let entity_projected = execution_context.project_requires( + &requires_nodes.items, + entity, + &mut filtered_representations, + first, + None, + ); + if entity_projected { + representations.push(entity); + first = false; + } + }); + filtered_representations.push(']'); trace!( "traversed and collected representations: {:?} in {:#?}", representations.len(), now.elapsed() ); - match self.node.as_ref() { - PlanNode::Fetch(fetch_node) => { - let now = std::time::Instant::now(); - let ProjectRepresentationsResult { - representations: filtered_representations, - indexes: filtered_repr_indexes, - } = fetch_node.project_representations(execution_context, &representations); - trace!( - "projected representations: {:?} in {:#?}", - representations.len(), - now.elapsed() - ); - - let now = std::time::Instant::now(); - let result = fetch_node - .execute_for_projected_representations( - execution_context, - filtered_representations, - filtered_repr_indexes, - ) - .await; - trace!( - "executed projected representations: {:?} in {:?}", - representations.len(), - now.elapsed() - ); - // Process the result - process_representations_result(result, &mut representations, execution_context); - trace!( - "processed projected representations: {:?} in {:?}", - representations.len(), - now.elapsed() - ); - } - _ => { - unimplemented!( - "FlattenNode can only execute FetchNode as child node, found: {:?}", - self.node - ); + let result = fetch_node + .execute_for_projected_representations( + execution_context, + filtered_representations, + BTreeSet::new(), + ) + .await; + if let Some(entities) = result.entities { + for (entity, target) in entities.into_iter().zip(representations.iter_mut()) { + // Merge the entity into the representation + deep_merge::deep_merge(target, entity); } } } @@ -745,8 +696,8 @@ impl ExecutablePlanNode for ConditionNode { match variable_values.get(&self.condition) { Some(value) => { // Check if the value is a boolean - match value { - Value::Bool(b) => *b, + match value.as_bool() { + Some(b) => b, _ => true, // Default to true if not a boolean } } @@ -827,16 +778,14 @@ pub struct GraphQLErrorLocation { pub column: usize, } -#[derive(Serialize, Deserialize, Debug, Clone)] +#[derive(Deserialize, Debug, Clone)] #[serde(rename_all = "camelCase")] pub struct ExecutionRequest { pub query: String, - #[serde(skip_serializing_if = "Option::is_none")] pub operation_name: Option, - #[serde(skip_serializing_if = "Option::is_none")] pub variables: Option>, - #[serde(skip_serializing_if = "Option::is_none")] pub extensions: Option>, + pub representations: Option, } #[derive(Serialize, Deserialize, Debug, Clone)] @@ -865,386 +814,200 @@ pub struct QueryPlanExecutionContext<'a> { } impl QueryPlanExecutionContext<'_> { - #[instrument( - level = "trace", - skip_all, - fields( - requires_selections = ?requires_selections.iter().map(|s| s.to_string()).collect::>(), - entity = ?entity - ) - )] pub fn project_requires( &self, requires_selections: &Vec, entity: &Value, - ) -> Value { - if requires_selections.is_empty() { - return entity.clone(); // No selections to project, return the entity as is + buffer: &mut String, + first: bool, + response_key: Option<&str>, + ) -> bool { + if entity.is_null() { + return false; } - match entity { - Value::Null => Value::Null, - Value::Array(entity_array) => Value::Array( - entity_array - .iter() - .map(|item| self.project_requires(requires_selections, item)) - .collect(), - ), - Value::Object(entity_obj) => { - let mut result_map = Map::new(); - for requires_selection in requires_selections { - match &requires_selection { - SelectionItem::Field(requires_selection) => { - let field_name = &requires_selection.name; - let response_key = requires_selection.selection_identifier(); - let original = entity_obj - .get(field_name) - .unwrap_or(entity_obj.get(response_key).unwrap_or(&Value::Null)); - let projected_value: Value = self - .project_requires(&requires_selection.selections.items, original); - if !projected_value.is_null() { - result_map.insert(response_key.to_string(), projected_value); - } - } - SelectionItem::InlineFragment(requires_selection) => { - let type_name = match entity_obj.get(TYPENAME_FIELD) { - Some(Value::String(type_name)) => type_name, - _ => requires_selection.type_condition.as_str(), - }; - if entity_satisfies_type_condition( - &self.schema_metadata.possible_types, - type_name, - &requires_selection.type_condition, - ) { - let projected = self - .project_requires(&requires_selection.selections.items, entity); - // Merge the projected value into the result - if let Value::Object(projected_map) = projected { - deep_merge::deep_merge_objects(&mut result_map, projected_map); - } - // If the projected value is not an object, it will be ignored - } - } - } - } - if (result_map.is_empty()) - || (result_map.len() == 1 && result_map.contains_key(TYPENAME_FIELD)) - { - Value::Null - } else { - Value::Object(result_map) - } + + if let Some(b) = entity.as_bool() { + if !first { + buffer.push(','); } - Value::Bool(bool) => Value::Bool(*bool), - Value::Number(num) => Value::Number(num.to_owned()), - Value::String(string) => Value::String(string.to_string()), + if let Some(response_key) = response_key { + buffer.push('"'); + buffer.push_str(response_key); + buffer.push('"'); + buffer.push(':'); + buffer.push_str(if b { "true" } else { "false" }); + } else { + buffer.push_str(if b { "true" } else { "false" }); + } + return true; } - } -} -#[instrument( - level = "trace", - skip_all, - name = "entity_satisfies_type_condition", - fields( - type_name = %type_name, - type_condition = %type_condition, - ) -)] -fn entity_satisfies_type_condition( - possible_types: &HashMap>, - type_name: &str, - type_condition: &str, -) -> bool { - if type_name == type_condition { - true - } else { - let possible_types_for_type_condition = possible_types.get(type_condition); - match possible_types_for_type_condition { - Some(possible_types_for_type_condition) => { - possible_types_for_type_condition.contains(&type_name.to_string()) + if let Some(n) = entity.as_number() { + if !first { + buffer.push(','); } - None => { - // If no possible types are found, return false - false + if let Some(response_key) = response_key { + buffer.push('"'); + buffer.push_str(response_key); + buffer.push_str("\":"); } + + write!(buffer, "{}", n).unwrap(); + return true; } - } -} -// --- Helper Function for Flatten --- + if let Some(s) = entity.as_str() { + if !first { + buffer.push(','); + } + if let Some(response_key) = response_key { + buffer.push('"'); + buffer.push_str(response_key); + buffer.push_str("\":"); + } + write_and_escape_string(buffer, s); + return true; + } -/// Recursively traverses the data according to the path segments, -/// handling '@' for array iteration, and collects the final values.current_data.to_vec() -#[instrument(level = "trace", skip_all, fields( - current_type = ?current_data, - remaining_path = ?remaining_path -))] -pub fn traverse_and_collect<'a>( - current_data: &'a mut Value, - remaining_path: &[&str], -) -> Vec<&'a mut Value> { - match (current_data, remaining_path) { - (Value::Array(arr), []) => arr.iter_mut().collect(), // Base case: No more path segments, return all items in the array - (current_data, []) => vec![current_data], // Base case: No more path segments, - (Value::Object(obj), [next_segment, next_remaining_path @ ..]) => { - if let Some(next_value) = obj.get_mut(*next_segment) { - traverse_and_collect(next_value, next_remaining_path) + if let Some(entity_array) = entity.as_array() { + if !first { + buffer.push(','); + } + if let Some(response_key) = response_key { + buffer.push('"'); + buffer.push_str(response_key); + buffer.push_str("\":["); } else { - vec![] // No valid path segment + buffer.push('['); + } + let mut first = true; + for entity_item in entity_array { + self.project_requires(requires_selections, entity_item, buffer, first, None); + first = false; } + buffer.push(']'); + return true; } - (Value::Array(arr), ["@", next_remaining_path @ ..]) => arr - .iter_mut() - .flat_map(|item| traverse_and_collect(item, next_remaining_path)) - .collect(), - _ => vec![], // No valid path segment - } -} -// --- Helper Functions --- + if let Some(entity_obj) = entity.as_object() { + if requires_selections.is_empty() { + // It is probably a scalar with an object value, so we write it directly + write!(buffer, "{}", sonic_rs::to_string(entity_obj).unwrap()).unwrap(); + return true; + } + if entity_obj.is_empty() { + return false; + } -// --- Main Function (for testing) --- + if !first { + buffer.push(','); + } + if let Some(response_key) = response_key { + buffer.push('"'); + buffer.push_str(response_key); + buffer.push_str("\":{"); + } else { + buffer.push('{'); + } + let mut first = true; + self.project_requires_map_mut(requires_selections, entity_obj, buffer, &mut first); + buffer.push('}'); + return true; + } -#[instrument( - level = "trace", - skip_all, - fields( - type_name = %type_name, - selection_set = ?selection_set.items.iter().map(|s| s.to_string()).collect::>(), - obj = ?obj - ) -)] -fn project_selection_set_with_map( - obj: &mut Map, - errors: &mut Vec, - selection_set: &SelectionSet, - type_name: &str, - schema_metadata: &SchemaMetadata, - variable_values: &Option>, -) -> Option> { - let type_name = match obj.get(TYPENAME_FIELD) { - Some(Value::String(type_name)) => type_name, - _ => type_name, + panic!("Unexpected entity type"); } - .to_string(); - let field_map = schema_metadata.type_fields.get(&type_name)?; - let mut new_obj = Map::new(); - for selection in &selection_set.items { - match selection { - SelectionItem::Field(field) => { - // Get the type fields for the current type - // Type is not found in the schema - if let Some(ref skip_variable) = field.skip_if { - let variable_value = variable_values - .as_ref() - .and_then(|vars| vars.get(skip_variable)); - if variable_value == Some(&Value::Bool(true)) { - continue; // Skip this field if the variable is true - } - } - if let Some(ref include_variable) = field.include_if { - let variable_value = variable_values - .as_ref() - .and_then(|vars| vars.get(include_variable)); - if variable_value != Some(&Value::Bool(true)) { - continue; // Skip this field if the variable is not true + + fn project_requires_map_mut( + &self, + requires_selections: &Vec, + entity_obj: &sonic_rs::Object, + buffer: &mut String, + first: &mut bool, + ) { + for requires_selection in requires_selections { + match &requires_selection { + SelectionItem::Field(requires_selection) => { + let field_name = &requires_selection.name; + let response_key = requires_selection.selection_identifier(); + + let original = entity_obj + .get(field_name) + .or_else(|| entity_obj.get(&response_key)); + + if original.is_none() || original.is_some_and(|v| v.is_null()) { + continue; } - } - let response_key = field.alias.as_ref().unwrap_or(&field.name).to_string(); - if field.name == TYPENAME_FIELD { - new_obj.insert(response_key, Value::String(type_name.to_string())); - continue; - } - let field_type = field_map.get(&field.name); - if field.name == "__schema" && type_name == "Query" { - obj.insert( - response_key.to_string(), - schema_metadata.introspection_schema_root_json.clone(), + + // To avoid writing empty fields, we write to a temporary buffer first + self.project_requires( + &requires_selection.selections.items, + original.unwrap(), + buffer, + *first, + Some(response_key), ); + *first = false; } - let field_val = obj.get_mut(&response_key); - match (field_type, field_val) { - (Some(field_type), Some(field_val)) => { - match field_val { - Value::Object(field_val_map) => { - let new_field_val_map = project_selection_set_with_map( - field_val_map, - errors, - &field.selections, - field_type, - schema_metadata, - variable_values, - ); - match new_field_val_map { - Some(new_field_val_map) => { - // If the field is an object, merge the projected values - new_obj - .insert(response_key, Value::Object(new_field_val_map)); - } - None => { - new_obj.insert(response_key, Value::Null); - } - } - } - field_val => { - project_selection_set( - field_val, - errors, - &field.selections, - field_type, - schema_metadata, - variable_values, - ); - new_obj.insert( - response_key, - field_val.clone(), // Clone the value to insert - ); - } - } - } - (Some(_field_type), None) => { - // If the field is not found in the object, set it to Null - new_obj.insert(response_key, Value::Null); - } - (None, _) => { - // It won't reach here already, as the selection should be validated before projection - warn!( - "Field {} not found in type {}. Skipping projection.", - field.name, type_name + SelectionItem::InlineFragment(requires_selection) => { + let type_name_from_entity = entity_obj + .get(&TYPENAME_FIELD) + .and_then(sonic_rs::Value::as_str); + let type_name = match type_name_from_entity { + Some(tn_str) => tn_str, + None => requires_selection.type_condition.as_str(), + }; + + let satisfies_type_condition = type_name == requires_selection.type_condition + || self + .schema_metadata + .possible_types + .get(type_name) + .is_some_and(|s| s.contains(&requires_selection.type_condition)); + if satisfies_type_condition { + self.project_requires_map_mut( + &requires_selection.selections.items, + entity_obj, + buffer, + first, ); } } } - SelectionItem::InlineFragment(inline_fragment) => { - if entity_satisfies_type_condition( - &schema_metadata.possible_types, - &type_name, - &inline_fragment.type_condition, - ) { - let sub_new_obj = project_selection_set_with_map( - obj, - errors, - &inline_fragment.selections, - &type_name, - schema_metadata, - variable_values, - ); - if let Some(sub_new_obj) = sub_new_obj { - // If the inline fragment projection returns a new object, merge it - deep_merge_objects(&mut new_obj, sub_new_obj) - } else { - // If the inline fragment projection returns None, skip it - continue; - } - } - } } } - Some(new_obj) } -#[instrument( - level = "trace", - skip_all, - fields( - type_name = %type_name, - selection_set = ?selection_set.items.iter().map(|s| s.to_string()).collect::>(), - data = ?data - ) -)] -fn project_selection_set( - data: &mut Value, - errors: &mut Vec, - selection_set: &SelectionSet, - type_name: &str, - schema_metadata: &SchemaMetadata, - variable_values: &Option>, -) { - match data { - Value::Null => { - // If data is Null, no need to project further - } - Value::String(value) => { - if let Some(enum_values) = schema_metadata.enum_values.get(type_name) { - if !enum_values.contains(value) { - // If the value is not a valid enum value, add an error - // and set data to Null - *data = Value::Null; // Set data to Null if the value is not valid - errors.push(GraphQLError { - message: format!( - "Value is not a valid enum value for type '{}'", - type_name - ), - locations: None, - path: None, - extensions: None, - }); - } - } // No further processing needed for strings - } - Value::Array(arr) => { - // If data is an array, project each item in the array - for item in arr { - project_selection_set( - item, - errors, - selection_set, - type_name, - schema_metadata, - variable_values, - ); - } // No further processing needed for arrays - } - Value::Object(obj) => { - match project_selection_set_with_map( - obj, - errors, - selection_set, - type_name, - schema_metadata, - variable_values, - ) { - Some(new_obj) => { - // If the projection returns a new object, replace the old one - *obj = new_obj; - } - None => { - // If the projection returns None, set data to Null - *data = Value::Null; - } +pub fn traverse_and_callback<'a, Callback>( + current_data: &'a mut Value, + remaining_path: &[&str], + callback: &mut Callback, +) where + Callback: FnMut(&'a mut Value), +{ + if remaining_path.is_empty() { + callback(current_data); + return; + } + + let key = remaining_path[0]; + let rest_of_path = &remaining_path[1..]; + + if key == "@" { + if let Some(list) = current_data.as_array_mut() { + for item in list.iter_mut() { + traverse_and_callback(item, rest_of_path, callback); } } - _ => {} + } else if let Some(map) = current_data.as_object_mut() { + if let Some(next_data) = map.get_mut(&key) { + traverse_and_callback(next_data, rest_of_path, callback); + } } } -#[instrument(level = "trace", skip_all)] -pub fn project_data_by_operation( - data: &mut Value, - errors: &mut Vec, - operation: &OperationDefinition, - schema_metadata: &SchemaMetadata, - variable_values: &Option>, -) { - let root_type_name = match operation.operation_kind { - Some(OperationKind::Query) => "Query", - Some(OperationKind::Mutation) => "Mutation", - Some(OperationKind::Subscription) => "Subscription", - None => "Query", - }; - // Project the data based on the selection set - project_selection_set( - data, - errors, - &operation.selection_set, - root_type_name, - schema_metadata, - variable_values, - ) -} - #[instrument( - level = "trace", + level = "trace", skip_all, fields( query_plan = ?query_plan, @@ -1259,8 +1022,9 @@ pub async fn execute_query_plan( schema_metadata: &SchemaMetadata, operation: &OperationDefinition, has_introspection: bool, -) -> ExecutionResult { - let mut result_data = Value::Null; // Initialize data as Null + expose_query_plan: bool, +) -> String { + let mut result_data = Value::new_null(); // Initialize data as Null let mut result_errors = vec![]; // Initial errors are empty #[allow(unused_mut)] let mut result_extensions = HashMap::new(); // Initial extensions are empty @@ -1276,36 +1040,23 @@ pub async fn execute_query_plan( .await; result_errors = execution_context.errors; // Get the final errors from the execution context result_extensions = execution_context.extensions; // Get the final extensions from the execution context - if !result_data.is_null() || has_introspection { - if result_data.is_null() { - result_data = Value::Object(serde_json::Map::new()); // Initialize as empty object if Null - } - project_data_by_operation( - &mut result_data, - &mut result_errors, - operation, - schema_metadata, - variable_values, - ); + if result_data.is_null() && has_introspection { + result_data = Value::new_object(); // Ensure data is an empty object if it was null } - - ExecutionResult { - data: if result_data.is_null() { - None - } else { - Some(result_data) - }, - errors: if result_errors.is_empty() { - None - } else { - Some(result_errors) - }, - extensions: if result_extensions.is_empty() { - None - } else { - Some(result_extensions) - }, + if expose_query_plan { + result_extensions.insert( + "queryPlan".to_string(), + sonic_rs::to_value(query_plan).unwrap(), + ); } + projection::project_by_operation( + &mut result_data, + &mut result_errors, + &result_extensions, + operation, + schema_metadata, + variable_values, + ) } #[cfg(test)] diff --git a/lib/query-plan-executor/src/projection.rs b/lib/query-plan-executor/src/projection.rs new file mode 100644 index 000000000..4ccb79c29 --- /dev/null +++ b/lib/query-plan-executor/src/projection.rs @@ -0,0 +1,297 @@ +use std::collections::HashMap; +use std::fmt::Write; + +use query_planner::{ + ast::{ + operation::OperationDefinition, selection_item::SelectionItem, selection_set::SelectionSet, + }, + state::supergraph_state::OperationKind, +}; +use sonic_rs::{JsonValueMutTrait, JsonValueTrait, Value}; +use tracing::{instrument, warn}; + +use crate::{ + json_writer::write_and_escape_string, schema_metadata::SchemaMetadata, GraphQLError, + TYPENAME_FIELD, +}; + +#[instrument(level = "trace", skip_all)] +pub fn project_by_operation( + data: &mut Value, + errors: &mut Vec, + extensions: &HashMap, + operation: &OperationDefinition, + schema_metadata: &SchemaMetadata, + variable_values: &Option>, +) -> String { + let root_type_name = match operation.operation_kind { + Some(OperationKind::Query) => "Query", + Some(OperationKind::Mutation) => "Mutation", + Some(OperationKind::Subscription) => "Subscription", + None => "Query", + }; + + // We may want to remove it, but let's see. + let mut buffer = String::with_capacity(4096); + + buffer.push('{'); + buffer.push('"'); + buffer.push_str("data"); + buffer.push('"'); + buffer.push(':'); + + project_selection_set( + data, + errors, + &operation.selection_set, + root_type_name, + schema_metadata, + variable_values, + &mut buffer, + ); + + if !errors.is_empty() { + write!( + buffer, + ",\"errors\":{}", + sonic_rs::to_string(&errors).unwrap() + ) + .unwrap(); + } + if !extensions.is_empty() { + write!( + buffer, + ",\"extensions\":{}", + sonic_rs::to_string(&extensions).unwrap() + ) + .unwrap(); + } + + buffer.push('}'); + buffer +} + +#[instrument( + level = "trace", + skip_all, + fields( + type_name = %type_name, + selection_set = ?selection_set.items.iter().map(|s| s.to_string()).collect::>(), + data = ?data + ) +)] +fn project_selection_set( + data: &mut Value, + errors: &mut Vec, + selection_set: &SelectionSet, + type_name: &str, + schema_metadata: &SchemaMetadata, + variable_values: &Option>, + buffer: &mut String, +) { + if data.is_null() { + buffer.push_str("null"); + return; + } + + if let Some(b) = data.as_bool() { + if b { + buffer.push_str("true"); + } else { + buffer.push_str("false"); + } + return; + } + + if let Some(num) = data.as_number() { + write!(buffer, "{}", num).unwrap(); + return; + } + + if let Some(value) = data.as_str() { + if let Some(enum_values) = schema_metadata.enum_values.get(type_name) { + if !enum_values.contains(value) { + *data = Value::new_null(); + errors.push(GraphQLError { + message: format!("Value is not a valid enum value for type '{}'", type_name), + locations: None, + path: None, + extensions: None, + }); + buffer.push_str("null"); + return; + } + } + write_and_escape_string(buffer, value); + return; + } + + if let Some(arr) = data.as_array_mut() { + buffer.push('['); + let mut first = true; + for item in arr.iter_mut() { + if !first { + buffer.push(','); + } + project_selection_set( + item, + errors, + selection_set, + type_name, + schema_metadata, + variable_values, + buffer, + ); + first = false; + } + buffer.push(']'); + return; + } + + if let Some(obj) = data.as_object_mut() { + buffer.push('{'); + let mut first = true; + project_selection_set_with_map( + obj, + errors, + selection_set, + type_name, + schema_metadata, + variable_values, + buffer, + &mut first, + ); + buffer.push('}'); + return; + } + + panic!("Unexpected data type {}", data); +} + +#[instrument( + level = "trace", + skip_all, + fields( + type_name = %type_name, + selection_set = ?selection_set.items.iter().map(|s| s.to_string()).collect::>(), + obj = ?obj + ) +)] +// TODO: simplfy args +#[allow(clippy::too_many_arguments)] +fn project_selection_set_with_map( + obj: &mut sonic_rs::Object, + errors: &mut Vec, + selection_set: &SelectionSet, + type_name: &str, + schema_metadata: &SchemaMetadata, + variable_values: &Option>, + buffer: &mut String, + first: &mut bool, +) { + let type_name = obj + .get(&TYPENAME_FIELD) + .and_then(sonic_rs::Value::as_str) + .unwrap_or(type_name) + .to_string(); + let field_map = schema_metadata.type_fields.get(&type_name); + let possible_types_of_type = schema_metadata.possible_types.get(&type_name); + + for selection in &selection_set.items { + match selection { + SelectionItem::Field(field) => { + if let Some(ref skip_variable) = field.skip_if { + let variable_value = variable_values + .as_ref() + .and_then(|vars| vars.get(skip_variable)); + if variable_value == Some(&true.into()) { + continue; // Skip this field if the variable is true + } + } + if let Some(ref include_variable) = field.include_if { + let variable_value = variable_values + .as_ref() + .and_then(|vars| vars.get(include_variable)); + if variable_value != Some(&true.into()) { + continue; // Skip this field if the variable is not true + } + } + + let response_key = field.alias.as_ref().unwrap_or(&field.name); + + if !*first { + buffer.push(','); + } + *first = false; + + if field.name == TYPENAME_FIELD { + buffer.push('"'); + buffer.push_str(response_key); + buffer.push_str("\":\""); + buffer.push_str(&type_name); + buffer.push('"'); + continue; + } + + buffer.push('"'); + buffer.push_str(response_key); + buffer.push_str("\":"); + + let field_map = field_map.unwrap(); + let field_type = field_map.get(&field.name); + + if field.name == "__schema" && type_name == "Query" { + obj.insert( + response_key, + schema_metadata.introspection_schema_root_json.clone(), + ); + } + + let field_val = obj.get_mut(response_key); + + match (field_type, field_val) { + (Some(field_type), Some(field_val)) => { + project_selection_set( + field_val, + errors, + &field.selections, + field_type, + schema_metadata, + variable_values, + buffer, + ); + } + (Some(_field_type), None) => { + // If the field is not found in the object, set it to Null + buffer.push_str("null"); + } + (None, _) => { + // It won't reach here already, as the selection should be validated before projection + warn!( + "Field {} not found in type {}. Skipping projection.", + field.name, type_name + ); + } + } + } + SelectionItem::InlineFragment(inline_fragment) => { + let type_condition = &inline_fragment.type_condition; + let satisfies_type_condition = &type_name == type_condition + || possible_types_of_type.is_some_and(|s| s.contains(type_condition)); + + if satisfies_type_condition { + project_selection_set_with_map( + obj, + errors, + &inline_fragment.selections, + &type_name, + schema_metadata, + variable_values, + buffer, + first, + ); + } + } + } + } +} diff --git a/lib/query-plan-executor/src/schema_metadata.rs b/lib/query-plan-executor/src/schema_metadata.rs index 73bcab668..ad9a18323 100644 --- a/lib/query-plan-executor/src/schema_metadata.rs +++ b/lib/query-plan-executor/src/schema_metadata.rs @@ -1,16 +1,16 @@ -use std::collections::HashMap; +use std::collections::{HashMap, HashSet}; use graphql_parser::{ query::Type, schema::{Definition, TypeDefinition}, }; use query_planner::consumer_schema::ConsumerSchema; -use serde_json::{json, Value}; +use sonic_rs::{json, Value}; #[derive(Debug)] pub struct SchemaMetadata { - pub possible_types: HashMap>, - pub enum_values: HashMap>, + pub possible_types: HashMap>, + pub enum_values: HashMap>, pub type_fields: HashMap>, pub introspection_schema_root_json: Value, } @@ -23,15 +23,15 @@ impl SchemaWithMetadata for ConsumerSchema { fn schema_metadata(&self) -> SchemaMetadata { let mut first_possible_types: HashMap> = HashMap::new(); let mut type_fields: HashMap> = HashMap::new(); - let mut enum_values: HashMap> = HashMap::new(); + let mut enum_values: HashMap> = HashMap::new(); for definition in &self.document.definitions { match definition { Definition::TypeDefinition(TypeDefinition::Enum(enum_type)) => { let name = enum_type.name.to_string(); - let mut values = vec![]; + let mut values = HashSet::with_capacity(enum_type.values.len()); for enum_value in &enum_type.values { - values.push(enum_value.name.to_string()); + values.insert(enum_value.name.to_string()); } enum_values.insert(name, values); } @@ -77,16 +77,16 @@ impl SchemaWithMetadata for ConsumerSchema { } } - let mut final_possible_types: HashMap> = HashMap::new(); + let mut final_possible_types: HashMap> = HashMap::new(); // Re-iterate over the possible_types for (definition_name_of_x, first_possible_types_of_x) in &first_possible_types { - let mut possible_types_of_x: Vec = Vec::new(); + let mut possible_types_of_x: HashSet = HashSet::new(); for definition_name_of_y in first_possible_types_of_x { - possible_types_of_x.push(definition_name_of_y.to_string()); + possible_types_of_x.insert(definition_name_of_y.to_string()); let possible_types_of_y = first_possible_types.get(definition_name_of_y); if let Some(possible_types_of_y) = possible_types_of_y { for definition_name_of_z in possible_types_of_y { - possible_types_of_x.push(definition_name_of_z.to_string()); + possible_types_of_x.insert(definition_name_of_z.to_string()); } } } diff --git a/lib/query-plan-executor/src/tests/mod.rs b/lib/query-plan-executor/src/tests/mod.rs index f4c6113dc..7a7aafd40 100644 --- a/lib/query-plan-executor/src/tests/mod.rs +++ b/lib/query-plan-executor/src/tests/mod.rs @@ -42,11 +42,9 @@ fn query_executor_pipeline_locally() { &schema_metadata, normalized_operation, false, + false, ) .await; - insta::assert_snapshot!(format!( - "{}", - serde_json::to_string_pretty(&result).unwrap_or_default() - )); + insta::assert_snapshot!(result); }); } diff --git a/lib/query-plan-executor/src/tests/snapshots/query_plan_executor__tests__query_executor_pipeline_locally.snap b/lib/query-plan-executor/src/tests/snapshots/query_plan_executor__tests__query_executor_pipeline_locally.snap index f36cb38a0..b81cfdd0a 100644 --- a/lib/query-plan-executor/src/tests/snapshots/query_plan_executor__tests__query_executor_pipeline_locally.snap +++ b/lib/query-plan-executor/src/tests/snapshots/query_plan_executor__tests__query_executor_pipeline_locally.snap @@ -1,2336 +1,5 @@ --- source: lib/query-plan-executor/src/tests/mod.rs -expression: "format!(\"{}\", serde_json::to_string_pretty(&result).unwrap_or_default())" +expression: result --- -{ - "data": { - "users": [ - { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100, - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - }, - { - "id": "3", - "body": "sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - }, - { - "id": "4", - "body": "Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - } - ] - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100, - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - }, - { - "id": "3", - "body": "sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - }, - { - "id": "4", - "body": "Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - } - ] - } - } - ] - }, - { - "id": "2", - "username": "dotansimha", - "name": "Dotan Simha", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100, - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - }, - { - "id": "3", - "body": "sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - }, - { - "id": "4", - "body": "Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - } - ] - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100, - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - }, - { - "id": "3", - "body": "sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - }, - { - "id": "4", - "body": "Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - } - ] - } - } - ] - }, - { - "id": "3", - "username": "kamilkisiela", - "name": "Kamil Kisiela", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100, - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - }, - { - "id": "3", - "body": "sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - }, - { - "id": "4", - "body": "Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - } - ] - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100, - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - }, - { - "id": "3", - "body": "sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - }, - { - "id": "4", - "body": "Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - } - ] - } - } - ] - }, - { - "id": "4", - "username": "ardatan", - "name": "Arda Tanrikulu", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100, - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - }, - { - "id": "3", - "body": "sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - }, - { - "id": "4", - "body": "Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - } - ] - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100, - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - }, - { - "id": "3", - "body": "sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - }, - { - "id": "4", - "body": "Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - } - ] - } - } - ] - }, - { - "id": "5", - "username": "gilgardosh", - "name": "Gil Gardosh", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100, - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - }, - { - "id": "3", - "body": "sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - }, - { - "id": "4", - "body": "Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - } - ] - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100, - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - }, - { - "id": "3", - "body": "sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - }, - { - "id": "4", - "body": "Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - } - ] - } - } - ] - }, - { - "id": "6", - "username": "laurin", - "name": "Laurin Quast", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100, - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - }, - { - "id": "3", - "body": "sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - }, - { - "id": "4", - "body": "Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - } - ] - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100, - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - }, - { - "id": "3", - "body": "sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - }, - { - "id": "4", - "body": "Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - } - ] - } - } - ] - } - ], - "topProducts": [ - { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100, - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - }, - { - "id": "3", - "body": "sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - }, - { - "id": "4", - "body": "Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - } - ] - }, - { - "inStock": false, - "name": "Couch", - "price": 1299, - "shippingEstimate": null, - "upc": "2", - "weight": 1000, - "reviews": [ - { - "id": "5", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - }, - { - "id": "6", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - }, - { - "id": "7", - "body": "sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - }, - { - "id": "8", - "body": "Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - } - ] - }, - { - "inStock": false, - "name": "Glass", - "price": 15, - "shippingEstimate": null, - "upc": "3", - "weight": 20, - "reviews": [ - { - "id": "9", - "body": "Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - } - ] - }, - { - "inStock": false, - "name": "Chair", - "price": 499, - "shippingEstimate": null, - "upc": "4", - "weight": 100, - "reviews": [ - { - "id": "10", - "body": "Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - }, - { - "id": "11", - "body": "At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat.", - "author": { - "id": "1", - "username": "urigo", - "name": "Uri Goldshtein", - "reviews": [ - { - "id": "1", - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - }, - { - "id": "2", - "body": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi", - "product": { - "inStock": true, - "name": "Table", - "price": 899, - "shippingEstimate": null, - "upc": "1", - "weight": 100 - } - } - ] - } - } - ] - }, - { - "inStock": true, - "name": "TV", - "price": 1299, - "shippingEstimate": null, - "upc": "5", - "weight": 1000, - "reviews": [] - } - ] - } -} +{"data":{"users":[{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100,"reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}},{"id":"3","body":"sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}},{"id":"4","body":"Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}}]}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100,"reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}},{"id":"3","body":"sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}},{"id":"4","body":"Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}}]}}]},{"id":"2","username":"dotansimha","name":"Dotan Simha","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100,"reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}},{"id":"3","body":"sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}},{"id":"4","body":"Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}}]}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100,"reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}},{"id":"3","body":"sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}},{"id":"4","body":"Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}}]}}]},{"id":"3","username":"kamilkisiela","name":"Kamil Kisiela","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100,"reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}},{"id":"3","body":"sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}},{"id":"4","body":"Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}}]}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100,"reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}},{"id":"3","body":"sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}},{"id":"4","body":"Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}}]}}]},{"id":"4","username":"ardatan","name":"Arda Tanrikulu","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100,"reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}},{"id":"3","body":"sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}},{"id":"4","body":"Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}}]}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100,"reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}},{"id":"3","body":"sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}},{"id":"4","body":"Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}}]}}]},{"id":"5","username":"gilgardosh","name":"Gil Gardosh","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100,"reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}},{"id":"3","body":"sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}},{"id":"4","body":"Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}}]}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100,"reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}},{"id":"3","body":"sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}},{"id":"4","body":"Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}}]}}]},{"id":"6","username":"laurin","name":"Laurin Quast","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100,"reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}},{"id":"3","body":"sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}},{"id":"4","body":"Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}}]}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100,"reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}},{"id":"3","body":"sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}},{"id":"4","body":"Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}}]}}]}],"topProducts":[{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100,"reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}},{"id":"3","body":"sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}},{"id":"4","body":"Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}}]},{"inStock":false,"name":"Couch","price":1299,"shippingEstimate":null,"upc":"2","weight":1000,"reviews":[{"id":"5","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}},{"id":"6","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}},{"id":"7","body":"sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}},{"id":"8","body":"Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}}]},{"inStock":false,"name":"Glass","price":15,"shippingEstimate":null,"upc":"3","weight":20,"reviews":[{"id":"9","body":"Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}}]},{"inStock":false,"name":"Chair","price":499,"shippingEstimate":null,"upc":"4","weight":100,"reviews":[{"id":"10","body":"Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}},{"id":"11","body":"At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat.","author":{"id":"1","username":"urigo","name":"Uri Goldshtein","reviews":[{"id":"1","body":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}},{"id":"2","body":"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugi","product":{"inStock":true,"name":"Table","price":899,"shippingEstimate":null,"upc":"1","weight":100}}]}}]},{"inStock":true,"name":"TV","price":1299,"shippingEstimate":null,"upc":"5","weight":1000,"reviews":[]}]}} diff --git a/lib/query-plan-executor/src/value_from_ast.rs b/lib/query-plan-executor/src/value_from_ast.rs index 1e56a12b7..673e05b5c 100644 --- a/lib/query-plan-executor/src/value_from_ast.rs +++ b/lib/query-plan-executor/src/value_from_ast.rs @@ -1,40 +1,37 @@ -use std::collections::HashMap; +use std::collections::{BTreeMap, HashMap}; -use serde_json::Map; +use sonic_rs::Value as SonicValue; pub fn value_from_ast( value: &graphql_parser::query::Value<'static, String>, - variables: &Option>, -) -> Result { + variables: &Option>, +) -> Result { match value { - graphql_parser::query::Value::Null => Ok(serde_json::Value::Null), - graphql_parser::query::Value::Boolean(b) => Ok(serde_json::Value::Bool(*b)), - graphql_parser::query::Value::String(s) => Ok(serde_json::Value::String(s.to_string())), - graphql_parser::query::Value::Enum(e) => Ok(serde_json::Value::String(e.to_string())), + graphql_parser::query::Value::Null => Ok(SonicValue::new_null()), + graphql_parser::query::Value::Boolean(b) => Ok((*b).into()), + graphql_parser::query::Value::String(s) => Ok(s.into()), + graphql_parser::query::Value::Enum(e) => Ok(e.into()), // TODO: Handle variable parsing errors here just like in GraphQL-JS graphql_parser::query::Value::Int(n) => { let n = n.as_i64().ok_or_else(|| "Failed to coerce".to_string())?; - let n = serde_json::Number::from(n); - Ok(serde_json::Value::Number(n)) + let n = SonicValue::from(n); + Ok(n) } graphql_parser::query::Value::Float(n) => { - let n = serde_json::Number::from_f64(*n); - n.map_or_else( - || Err("Failed to coerce".to_string()), - |num| Ok(serde_json::Value::Number(num)), - ) + let n = SonicValue::new_f64(*n); + n.map_or_else(|| Err("Failed to coerce".to_string()), |num| Ok(num)) } graphql_parser::query::Value::List(l) => { - let list: Result, String> = + let list: Result, String> = l.iter().map(|v| value_from_ast(v, variables)).collect(); match list { Err(e) => Err(e), - Ok(vec) => Ok(serde_json::Value::Array(vec)), + Ok(vec) => Ok(vec.into()), } } graphql_parser::query::Value::Object(o) => { - let obj: Result, String> = o + let obj: Result, String> = o .iter() .map(|(k, v)| value_from_ast(v, variables).map(|val| (k.to_string(), val))) .collect(); @@ -42,8 +39,8 @@ pub fn value_from_ast( match obj { Err(e) => Err(e), Ok(map) => { - // Convert BTreeMap to serde_json::Value::Object - Ok(serde_json::Value::Object(map)) + // Convert BTreeMap to Value::Object + Ok(SonicValue::from_iter(map.iter())) } } } @@ -52,10 +49,10 @@ pub fn value_from_ast( if let Some(value) = variables_map.get(var_name) { Ok(value.clone()) // Return the value from the variables map } else { - Ok(serde_json::Value::Null) // If variable not found, return null + Ok(SonicValue::new_null()) // If variable not found, return null } } else { - Ok(serde_json::Value::Null) // If no variables provided, return null + Ok(SonicValue::new_null()) // If no variables provided, return null } } } diff --git a/lib/query-plan-executor/src/variables.rs b/lib/query-plan-executor/src/variables.rs index 5dcca511a..f74fde0e4 100644 --- a/lib/query-plan-executor/src/variables.rs +++ b/lib/query-plan-executor/src/variables.rs @@ -1,7 +1,7 @@ use std::collections::HashMap; use query_planner::state::supergraph_state::TypeNode; -use serde_json::Value; +use sonic_rs::{JsonContainerTrait, JsonValueTrait, Value}; use crate::schema_metadata::SchemaMetadata; @@ -66,7 +66,7 @@ fn validate_runtime_value( match type_node { TypeNode::Named(name) => { if let Some(enum_values) = schema_metadata.enum_values.get(name) { - if let Value::String(ref s) = value { + if let Some(s) = value.as_str() { if !enum_values.contains(&s.to_string()) { return Err(format!( "Value '{}' is not a valid enum value for type '{}'", @@ -80,7 +80,7 @@ fn validate_runtime_value( )); } } else if let Some(fields) = schema_metadata.type_fields.get(name) { - if let Value::Object(obj) = value { + if let Some(obj) = value.as_object() { for (field_name, field_type) in fields { if let Some(field_value) = obj.get(field_name) { validate_runtime_value( @@ -104,7 +104,7 @@ fn validate_runtime_value( } else { return match name.as_str() { "String" => { - if let Value::String(_) = value { + if value.is_str() { Ok(()) } else { Err(format!( @@ -114,15 +114,8 @@ fn validate_runtime_value( } } "Int" => { - if let Value::Number(num) = value { - if num.is_i64() { - Ok(()) - } else { - Err(format!( - "Expected an integer for type '{}', got {:?}", - name, value - )) - } + if value.is_i64() { + Ok(()) } else { Err(format!( "Expected a number for type '{}', got {:?}", @@ -131,15 +124,8 @@ fn validate_runtime_value( } } "Float" => { - if let Value::Number(num) = value { - if num.is_f64() || num.is_i64() { - Ok(()) - } else { - Err(format!( - "Expected a float for type '{}', got {:?}", - name, value - )) - } + if value.is_f64() || value.is_i64() { + Ok(()) } else { Err(format!( "Expected a number for type '{}', got {:?}", @@ -148,7 +134,7 @@ fn validate_runtime_value( } } "Boolean" => { - if let Value::Bool(_) = value { + if value.is_boolean() { Ok(()) } else { Err(format!( @@ -158,7 +144,7 @@ fn validate_runtime_value( } } "ID" => { - if let Value::String(_) = value { + if value.is_str() { Ok(()) } else { Err(format!("Expected a string for type 'ID', got {:?}", value)) @@ -175,7 +161,7 @@ fn validate_runtime_value( validate_runtime_value(value, inner_type, schema_metadata)?; } TypeNode::List(inner_type) => { - if let Value::Array(arr) = value { + if let Some(arr) = value.as_array() { for item in arr { validate_runtime_value(item, inner_type, schema_metadata)?; } diff --git a/lib/query-planner/Cargo.toml b/lib/query-planner/Cargo.toml index 5d952d121..957940028 100644 --- a/lib/query-planner/Cargo.toml +++ b/lib/query-planner/Cargo.toml @@ -13,7 +13,7 @@ thiserror = "2.0.12" petgraph = "0.8.0" tracing = { version = "0.1.41" } serde = "1.0.219" -serde_json = { version = "1.0.140", features = ["preserve_order"] } +sonic-rs = "0.5.1" [dev-dependencies] insta = { version = "1.42.1" } diff --git a/lib/query-planner/src/ast/value.rs b/lib/query-planner/src/ast/value.rs index f2895793a..f9ab87819 100644 --- a/lib/query-planner/src/ast/value.rs +++ b/lib/query-planner/src/ast/value.rs @@ -1,3 +1,4 @@ +use sonic_rs::Value as SonicValue; use std::{ collections::{BTreeMap, BTreeSet}, fmt::Display, @@ -98,52 +99,37 @@ impl From<&mut ParserValue<'_, String>> for Value { } } -impl From<&Value> for serde_json::Value { +impl From<&Value> for SonicValue { fn from(value: &Value) -> Self { match value { - Value::Null => serde_json::Value::Null, - Value::Int(n) => serde_json::Value::Number((*n).into()), - Value::Boolean(b) => serde_json::Value::Bool(*b), - Value::Enum(s) => serde_json::Value::String(s.to_string()), - Value::Float(n) => { - let number = serde_json::Number::from_f64(*n); - match number { - Some(num) => serde_json::Value::Number(num), - None => serde_json::Value::Null, // Handle case where float conversion fails + Value::Null => SonicValue::new_null(), + Value::Int(n) => (*n).into(), + Value::Boolean(b) => (*b).into(), + Value::Enum(s) => s.into(), + Value::Float(n) => match SonicValue::new_f64(*n) { + Some(num) => num, + None => SonicValue::new_null(), + }, + Value::List(l) => { + let mut array_value = SonicValue::new_array_with(l.len()); + + for val in l.iter() { + array_value.append_value(val.into()); } + + array_value } - Value::List(l) => serde_json::Value::Array(l.iter().map(|v| v.into()).collect()), - Value::Object(o) => serde_json::Value::Object( - o.iter().map(|(k, v)| (k.to_string(), v.into())).collect(), - ), - Value::String(s) => serde_json::Value::String(s.to_string()), - Value::Variable(_var_name) => serde_json::Value::Null, - } - } -} + Value::Object(o) => { + let mut object_value = SonicValue::new_object_with(o.len()); -impl From<&mut Value> for serde_json::Value { - fn from(value: &mut Value) -> Self { - match value { - Value::Null => serde_json::Value::Null, - Value::Int(n) => serde_json::Value::Number((mem::take(n)).into()), - Value::Boolean(b) => serde_json::Value::Bool(mem::take(b)), - Value::Enum(s) => serde_json::Value::String(mem::take(s)), - Value::Float(n) => { - let number = serde_json::Number::from_f64(mem::take(n)); - match number { - Some(num) => serde_json::Value::Number(num), - None => serde_json::Value::Null, // Handle case where float conversion fails + for (k, v) in o.iter() { + object_value.insert(k, v.into()); } + + object_value } - Value::List(l) => serde_json::Value::Array(l.iter_mut().map(|v| v.into()).collect()), - Value::Object(o) => serde_json::Value::Object( - o.iter_mut() - .map(|(k, v)| (k.to_string(), v.into())) - .collect(), - ), - Value::String(s) => serde_json::Value::String(mem::take(s)), - Value::Variable(_var_name) => serde_json::Value::Null, + Value::String(s) => s.into(), + Value::Variable(_var_name) => SonicValue::new_null(), } } } diff --git a/lib/query-planner/src/planner/fetch/fetch_graph.rs b/lib/query-planner/src/planner/fetch/fetch_graph.rs index cb2db5295..48b090df8 100644 --- a/lib/query-planner/src/planner/fetch/fetch_graph.rs +++ b/lib/query-planner/src/planner/fetch/fetch_graph.rs @@ -1595,7 +1595,7 @@ fn process_entity_move_edge( format!("... on {}", output_type_name), "__typename".to_string(), ], - set_value_to: output_type_name.clone().into(), + set_value_to: output_type_name.into(), })); } @@ -1723,7 +1723,7 @@ fn process_interface_object_type_move_edge( format!("... on {}", interface_type_name), "__typename".to_string(), ], - set_value_to: interface_type_name.clone().into(), + set_value_to: interface_type_name.into(), })); let parent_fetch_step = fetch_graph.get_step_data_mut(parent_fetch_step_index)?; diff --git a/lib/query-planner/src/planner/plan_nodes.rs b/lib/query-planner/src/planner/plan_nodes.rs index e0eb34d1e..40a95d155 100644 --- a/lib/query-planner/src/planner/plan_nodes.rs +++ b/lib/query-planner/src/planner/plan_nodes.rs @@ -98,8 +98,7 @@ pub enum FetchRewrite { #[serde(rename_all = "camelCase")] pub struct ValueSetter { pub path: Vec, - // Use serde_json::Value for the 'any' type - pub set_value_to: serde_json::Value, + pub set_value_to: sonic_rs::Value, } #[derive(Serialize, Deserialize, Debug, Clone)] diff --git a/lib/query-planner/src/tests/arguments.rs b/lib/query-planner/src/tests/arguments.rs index d871de51d..3759d5944 100644 --- a/lib/query-planner/src/tests/arguments.rs +++ b/lib/query-planner/src/tests/arguments.rs @@ -96,7 +96,7 @@ fn requires_arguments_deeply_nested_requires() -> Result<(), Box> { }, "#); - insta::assert_snapshot!(format!("{}", serde_json::to_string_pretty(&query_plan).unwrap_or_default()), @r#" + insta::assert_snapshot!(format!("{}", sonic_rs::to_string_pretty(&query_plan).unwrap_or_default()), @r#" { "kind": "QueryPlan", "node": { @@ -307,7 +307,7 @@ fn requires_arguments_deeply_nested_requires_with_variable() -> Result<(), Box Result<(), Box> { }, "#); - insta::assert_snapshot!(format!("{}", serde_json::to_string_pretty(&query_plan).unwrap_or_default()), @r#" + insta::assert_snapshot!(format!("{}", sonic_rs::to_string_pretty(&query_plan).unwrap_or_default()), @r#" { "kind": "QueryPlan", "node": { @@ -943,7 +943,7 @@ fn multiple_plain_field_and_requires_with_args_that_conflicts() -> Result<(), Bo }, "#); - insta::assert_snapshot!(format!("{}", serde_json::to_string_pretty(&query_plan).unwrap_or_default()), @r#" + insta::assert_snapshot!(format!("{}", sonic_rs::to_string_pretty(&query_plan).unwrap_or_default()), @r#" { "kind": "QueryPlan", "node": { @@ -1128,7 +1128,7 @@ fn multiple_plain_field_and_requires_with_args_that_does_not_conflicts_should_me }, "###); - insta::assert_snapshot!(format!("{}", serde_json::to_string_pretty(&query_plan).unwrap_or_default()), @r#" + insta::assert_snapshot!(format!("{}", sonic_rs::to_string_pretty(&query_plan).unwrap_or_default()), @r#" { "kind": "QueryPlan", "node": { @@ -1269,7 +1269,7 @@ fn simple_requires_arguments() -> Result<(), Box> { }, "#); - insta::assert_snapshot!(format!("{}", serde_json::to_string_pretty(&query_plan).unwrap_or_default()), @r#" + insta::assert_snapshot!(format!("{}", sonic_rs::to_string_pretty(&query_plan).unwrap_or_default()), @r#" { "kind": "QueryPlan", "node": { @@ -1479,7 +1479,7 @@ fn arguments_in_different_levels() -> Result<(), Box> { }, "#); - insta::assert_snapshot!(format!("{}", serde_json::to_string_pretty(&query_plan).unwrap_or_default()), @r#" + insta::assert_snapshot!(format!("{}", sonic_rs::to_string_pretty(&query_plan).unwrap_or_default()), @r#" { "kind": "QueryPlan", "node": { @@ -1537,7 +1537,7 @@ fn arguments_and_variables() -> Result<(), Box> { }, }, "#); - insta::assert_snapshot!(format!("{}", serde_json::to_string_pretty(&query_plan).unwrap_or_default()), @r#" + insta::assert_snapshot!(format!("{}", sonic_rs::to_string_pretty(&query_plan).unwrap_or_default()), @r#" { "kind": "QueryPlan", "node": { @@ -1857,7 +1857,7 @@ fn arguments_variables_mixed() -> Result<(), Box> { }, "#); - insta::assert_snapshot!(format!("{}", serde_json::to_string_pretty(&query_plan).unwrap_or_default()), @r#" + insta::assert_snapshot!(format!("{}", sonic_rs::to_string_pretty(&query_plan).unwrap_or_default()), @r#" { "kind": "QueryPlan", "node": { diff --git a/lib/query-planner/src/tests/interface_object.rs b/lib/query-planner/src/tests/interface_object.rs index a3107fbdb..b60fc9de8 100644 --- a/lib/query-planner/src/tests/interface_object.rs +++ b/lib/query-planner/src/tests/interface_object.rs @@ -387,7 +387,7 @@ fn interface_object_with_inline_fragment_resolving_remote_interface_field( }, "#); - insta::assert_snapshot!(format!("{}", serde_json::to_string_pretty(&query_plan).unwrap_or_default()), @r#" + insta::assert_snapshot!(format!("{}", sonic_rs::to_string_pretty(&query_plan).unwrap_or_default()), @r#" { "kind": "QueryPlan", "node": { diff --git a/lib/query-planner/src/tests/interface_object_with_requires.rs b/lib/query-planner/src/tests/interface_object_with_requires.rs index 4da6a1b8d..cf8605ca7 100644 --- a/lib/query-planner/src/tests/interface_object_with_requires.rs +++ b/lib/query-planner/src/tests/interface_object_with_requires.rs @@ -67,7 +67,7 @@ fn interface_object_requiring_interface_fields() -> Result<(), Box> { }, "#); - insta::assert_snapshot!(format!("{}", serde_json::to_string_pretty(&query_plan).unwrap_or_default()), @r#" + insta::assert_snapshot!(format!("{}", sonic_rs::to_string_pretty(&query_plan).unwrap_or_default()), @r#" { "kind": "QueryPlan", "node": { @@ -210,7 +210,7 @@ fn interface_field_from_remote_graph_with_requires() -> Result<(), Box Result<(), Box }, "#); - insta::assert_snapshot!(format!("{}", serde_json::to_string_pretty(&query_plan).unwrap_or_default()), @r#" + insta::assert_snapshot!(format!("{}", sonic_rs::to_string_pretty(&query_plan).unwrap_or_default()), @r#" { "kind": "QueryPlan", "node": { @@ -430,7 +430,7 @@ fn inline_fragment_on_local_type_behind_interface() -> Result<(), Box }, "#); - insta::assert_snapshot!(format!("{}", serde_json::to_string_pretty(&query_plan).unwrap_or_default()), @r#" + insta::assert_snapshot!(format!("{}", sonic_rs::to_string_pretty(&query_plan).unwrap_or_default()), @r#" { "kind": "QueryPlan", "node": { @@ -520,7 +520,7 @@ fn interface_object_field_with_requires_and_inline_fragment() -> Result<(), Box< }, "#); - insta::assert_snapshot!(format!("{}", serde_json::to_string_pretty(&query_plan).unwrap_or_default()), @r#" + insta::assert_snapshot!(format!("{}", sonic_rs::to_string_pretty(&query_plan).unwrap_or_default()), @r#" { "kind": "QueryPlan", "node": { @@ -686,7 +686,7 @@ fn interface_field_from_remote_graph_with_requires_and_inline_fragment( }, "#); - insta::assert_snapshot!(format!("{}", serde_json::to_string_pretty(&query_plan).unwrap_or_default()), @r#" + insta::assert_snapshot!(format!("{}", sonic_rs::to_string_pretty(&query_plan).unwrap_or_default()), @r#" { "kind": "QueryPlan", "node": { diff --git a/lib/query-planner/src/tests/mutations.rs b/lib/query-planner/src/tests/mutations.rs index c2339aacd..bb5656ea1 100644 --- a/lib/query-planner/src/tests/mutations.rs +++ b/lib/query-planner/src/tests/mutations.rs @@ -56,7 +56,7 @@ fn mutations() -> Result<(), Box> { }, "#); - insta::assert_snapshot!(format!("{}", serde_json::to_string_pretty(&query_plan).unwrap_or_default()), @r#" + insta::assert_snapshot!(format!("{}", sonic_rs::to_string_pretty(&query_plan).unwrap_or_default()), @r#" { "kind": "QueryPlan", "node": { diff --git a/lib/query-planner/src/tests/object_entities.rs b/lib/query-planner/src/tests/object_entities.rs index 496f61edc..59a742652 100644 --- a/lib/query-planner/src/tests/object_entities.rs +++ b/lib/query-planner/src/tests/object_entities.rs @@ -67,7 +67,7 @@ fn testing() -> Result<(), Box> { }, }, "#); - insta::assert_snapshot!(format!("{}", serde_json::to_string_pretty(&query_plan).unwrap_or_default()), @r#" + insta::assert_snapshot!(format!("{}", sonic_rs::to_string_pretty(&query_plan).unwrap_or_default()), @r#" { "kind": "QueryPlan", "node": { @@ -196,7 +196,7 @@ fn parent_entity_call() -> Result<(), Box> { }, }, "#); - insta::assert_snapshot!(format!("{}", serde_json::to_string_pretty(&query_plan).unwrap_or_default()), @r#" + insta::assert_snapshot!(format!("{}", sonic_rs::to_string_pretty(&query_plan).unwrap_or_default()), @r#" { "kind": "QueryPlan", "node": { @@ -334,7 +334,7 @@ fn parent_entity_call_complex() -> Result<(), Box> { }, }, "#); - insta::assert_snapshot!(format!("{}", serde_json::to_string_pretty(&query_plan).unwrap_or_default()), @r#" + insta::assert_snapshot!(format!("{}", sonic_rs::to_string_pretty(&query_plan).unwrap_or_default()), @r#" { "kind": "QueryPlan", "node": { @@ -519,7 +519,7 @@ fn complex_entity_call() -> Result<(), Box> { }, }, "#); - insta::assert_snapshot!(format!("{}", serde_json::to_string_pretty(&query_plan).unwrap_or_default()), @r#" + insta::assert_snapshot!(format!("{}", sonic_rs::to_string_pretty(&query_plan).unwrap_or_default()), @r#" { "kind": "QueryPlan", "node": { diff --git a/lib/query-planner/src/tests/override_requires.rs b/lib/query-planner/src/tests/override_requires.rs index 3e1f9b8df..4c6504f6c 100644 --- a/lib/query-planner/src/tests/override_requires.rs +++ b/lib/query-planner/src/tests/override_requires.rs @@ -190,7 +190,7 @@ fn override_with_requires_many() -> Result<(), Box> { }, }, "#); - insta::assert_snapshot!(format!("{}", serde_json::to_string_pretty(&query_plan).unwrap_or_default()), @r#" + insta::assert_snapshot!(format!("{}", sonic_rs::to_string_pretty(&query_plan).unwrap_or_default()), @r#" { "kind": "QueryPlan", "node": { @@ -543,7 +543,7 @@ fn override_with_requires_cname_in_c() -> Result<(), Box> { }, }, "#); - insta::assert_snapshot!(format!("{}", serde_json::to_string_pretty(&query_plan).unwrap_or_default()), @r#" + insta::assert_snapshot!(format!("{}", sonic_rs::to_string_pretty(&query_plan).unwrap_or_default()), @r#" { "kind": "QueryPlan", "node": { @@ -681,7 +681,7 @@ fn override_with_requires_cname_in_a() -> Result<(), Box> { }, }, "#); - insta::assert_snapshot!(format!("{}", serde_json::to_string_pretty(&query_plan).unwrap_or_default()), @r#" + insta::assert_snapshot!(format!("{}", sonic_rs::to_string_pretty(&query_plan).unwrap_or_default()), @r#" { "kind": "QueryPlan", "node": { @@ -819,7 +819,7 @@ fn override_with_requires_aname_in_a() -> Result<(), Box> { }, }, "#); - insta::assert_snapshot!(format!("{}", serde_json::to_string_pretty(&query_plan).unwrap_or_default()), @r#" + insta::assert_snapshot!(format!("{}", sonic_rs::to_string_pretty(&query_plan).unwrap_or_default()), @r#" { "kind": "QueryPlan", "node": { diff --git a/lib/query-planner/src/tests/overrides.rs b/lib/query-planner/src/tests/overrides.rs index a851a3ca3..b43432c2c 100644 --- a/lib/query-planner/src/tests/overrides.rs +++ b/lib/query-planner/src/tests/overrides.rs @@ -31,7 +31,7 @@ fn single_simple_overrides() -> Result<(), Box> { }, }, "#); - insta::assert_snapshot!(format!("{}", serde_json::to_string_pretty(&query_plan).unwrap_or_default()), @r#" + insta::assert_snapshot!(format!("{}", sonic_rs::to_string_pretty(&query_plan).unwrap_or_default()), @r#" { "kind": "QueryPlan", "node": { @@ -101,7 +101,7 @@ fn two_fields_simple_overrides() -> Result<(), Box> { }, }, "#); - insta::assert_snapshot!(format!("{}", serde_json::to_string_pretty(&query_plan).unwrap_or_default()), @r#" + insta::assert_snapshot!(format!("{}", sonic_rs::to_string_pretty(&query_plan).unwrap_or_default()), @r#" { "kind": "QueryPlan", "node": { diff --git a/lib/query-planner/src/tests/provides.rs b/lib/query-planner/src/tests/provides.rs index 111b9ddc2..2e0f847d2 100644 --- a/lib/query-planner/src/tests/provides.rs +++ b/lib/query-planner/src/tests/provides.rs @@ -54,7 +54,7 @@ fn simple_provides() -> Result<(), Box> { }, }, "#); - insta::assert_snapshot!(format!("{}", serde_json::to_string_pretty(&query_plan).unwrap_or_default()), @r#" + insta::assert_snapshot!(format!("{}", sonic_rs::to_string_pretty(&query_plan).unwrap_or_default()), @r#" { "kind": "QueryPlan", "node": { @@ -135,7 +135,7 @@ fn nested_provides() -> Result<(), Box> { }, }, "#); - insta::assert_snapshot!(format!("{}", serde_json::to_string_pretty(&query_plan).unwrap_or_default()), @r#" + insta::assert_snapshot!(format!("{}", sonic_rs::to_string_pretty(&query_plan).unwrap_or_default()), @r#" { "kind": "QueryPlan", "node": { @@ -191,7 +191,7 @@ fn provides_on_union() -> Result<(), Box> { }, }, "#); - insta::assert_snapshot!(format!("{}", serde_json::to_string_pretty(&query_plan).unwrap_or_default()), @r#" + insta::assert_snapshot!(format!("{}", sonic_rs::to_string_pretty(&query_plan).unwrap_or_default()), @r#" { "kind": "QueryPlan", "node": { @@ -259,7 +259,7 @@ fn provides_on_union() -> Result<(), Box> { }, }, "#); - insta::assert_snapshot!(format!("{}", serde_json::to_string_pretty(&query_plan).unwrap_or_default()), @r#" + insta::assert_snapshot!(format!("{}", sonic_rs::to_string_pretty(&query_plan).unwrap_or_default()), @r#" { "kind": "QueryPlan", "node": { diff --git a/lib/query-planner/src/tests/requires.rs b/lib/query-planner/src/tests/requires.rs index ae5cf0f62..fbfba8a84 100644 --- a/lib/query-planner/src/tests/requires.rs +++ b/lib/query-planner/src/tests/requires.rs @@ -82,7 +82,7 @@ fn two_same_service_calls_with_args_conflicts() -> Result<(), Box> { }, }, "#); - insta::assert_snapshot!(format!("{}", serde_json::to_string_pretty(&query_plan).unwrap_or_default()), @r#" + insta::assert_snapshot!(format!("{}", sonic_rs::to_string_pretty(&query_plan).unwrap_or_default()), @r#" { "kind": "QueryPlan", "node": { @@ -261,7 +261,7 @@ fn two_same_service_calls() -> Result<(), Box> { }, }, "#); - insta::assert_snapshot!(format!("{}", serde_json::to_string_pretty(&query_plan).unwrap_or_default()), @r#" + insta::assert_snapshot!(format!("{}", sonic_rs::to_string_pretty(&query_plan).unwrap_or_default()), @r#" { "kind": "QueryPlan", "node": { @@ -388,7 +388,7 @@ fn simplest_requires() -> Result<(), Box> { }, }, "#); - insta::assert_snapshot!(format!("{}", serde_json::to_string_pretty(&query_plan).unwrap_or_default()), @r#" + insta::assert_snapshot!(format!("{}", sonic_rs::to_string_pretty(&query_plan).unwrap_or_default()), @r#" { "kind": "QueryPlan", "node": { @@ -488,7 +488,7 @@ fn simplest_requires_with_local_sibling() -> Result<(), Box> { }, }, "#); - insta::assert_snapshot!(format!("{}", serde_json::to_string_pretty(&query_plan).unwrap_or_default()), @r#" + insta::assert_snapshot!(format!("{}", sonic_rs::to_string_pretty(&query_plan).unwrap_or_default()), @r#" { "kind": "QueryPlan", "node": { @@ -586,7 +586,7 @@ fn simple_requires() -> Result<(), Box> { }, }, "#); - insta::assert_snapshot!(format!("{}", serde_json::to_string_pretty(&query_plan).unwrap_or_default()), @r#" + insta::assert_snapshot!(format!("{}", sonic_rs::to_string_pretty(&query_plan).unwrap_or_default()), @r#" { "kind": "QueryPlan", "node": { @@ -692,7 +692,7 @@ fn two_fields_same_subgraph_same_requirement() -> Result<(), Box> { }, }, "#); - insta::assert_snapshot!(format!("{}", serde_json::to_string_pretty(&query_plan).unwrap_or_default()), @r#" + insta::assert_snapshot!(format!("{}", sonic_rs::to_string_pretty(&query_plan).unwrap_or_default()), @r#" { "kind": "QueryPlan", "node": { @@ -800,7 +800,7 @@ fn simple_requires_with_child() -> Result<(), Box> { }, }, "#); - insta::assert_snapshot!(format!("{}", serde_json::to_string_pretty(&query_plan).unwrap_or_default()), @r#" + insta::assert_snapshot!(format!("{}", sonic_rs::to_string_pretty(&query_plan).unwrap_or_default()), @r#" { "kind": "QueryPlan", "node": { @@ -928,7 +928,7 @@ fn keys_mashup() -> Result<(), Box> { }, }, "#); - insta::assert_snapshot!(format!("{}", serde_json::to_string_pretty(&query_plan).unwrap_or_default()), @r#" + insta::assert_snapshot!(format!("{}", sonic_rs::to_string_pretty(&query_plan).unwrap_or_default()), @r#" { "kind": "QueryPlan", "node": { diff --git a/lib/query-planner/src/tests/requires_provides.rs b/lib/query-planner/src/tests/requires_provides.rs index 153b707c2..b282c7326 100644 --- a/lib/query-planner/src/tests/requires_provides.rs +++ b/lib/query-planner/src/tests/requires_provides.rs @@ -81,7 +81,7 @@ fn simple_requires_provides() -> Result<(), Box> { }, }, "#); - insta::assert_snapshot!(format!("{}", serde_json::to_string_pretty(&query_plan).unwrap_or_default()), @r#" + insta::assert_snapshot!(format!("{}", sonic_rs::to_string_pretty(&query_plan).unwrap_or_default()), @r#" { "kind": "QueryPlan", "node": { diff --git a/lib/query-planner/src/tests/requires_requires.rs b/lib/query-planner/src/tests/requires_requires.rs index 5dec34a1a..f96ba0294 100644 --- a/lib/query-planner/src/tests/requires_requires.rs +++ b/lib/query-planner/src/tests/requires_requires.rs @@ -65,7 +65,7 @@ fn one() -> Result<(), Box> { }, }, "#); - insta::assert_snapshot!(format!("{}", serde_json::to_string_pretty(&query_plan).unwrap_or_default()), @r#" + insta::assert_snapshot!(format!("{}", sonic_rs::to_string_pretty(&query_plan).unwrap_or_default()), @r#" { "kind": "QueryPlan", "node": { @@ -226,7 +226,7 @@ fn one_with_one_local() -> Result<(), Box> { }, }, "#); - insta::assert_snapshot!(format!("{}", serde_json::to_string_pretty(&query_plan).unwrap_or_default()), @r#" + insta::assert_snapshot!(format!("{}", sonic_rs::to_string_pretty(&query_plan).unwrap_or_default()), @r#" { "kind": "QueryPlan", "node": { @@ -405,7 +405,7 @@ fn two_fields_with_the_same_requirements() -> Result<(), Box> { }, }, "#); - insta::assert_snapshot!(format!("{}", serde_json::to_string_pretty(&query_plan).unwrap_or_default()), @r#" + insta::assert_snapshot!(format!("{}", sonic_rs::to_string_pretty(&query_plan).unwrap_or_default()), @r#" { "kind": "QueryPlan", "node": { @@ -562,7 +562,7 @@ fn one_more() -> Result<(), Box> { }, }, "#); - insta::assert_snapshot!(format!("{}", serde_json::to_string_pretty(&query_plan).unwrap_or_default()), @r#" + insta::assert_snapshot!(format!("{}", sonic_rs::to_string_pretty(&query_plan).unwrap_or_default()), @r#" { "kind": "QueryPlan", "node": { @@ -749,7 +749,7 @@ fn another_two_fields_with_the_same_requirements() -> Result<(), Box> }, }, "#); - insta::assert_snapshot!(format!("{}", serde_json::to_string_pretty(&query_plan).unwrap_or_default()), @r#" + insta::assert_snapshot!(format!("{}", sonic_rs::to_string_pretty(&query_plan).unwrap_or_default()), @r#" { "kind": "QueryPlan", "node": { @@ -970,7 +970,7 @@ fn two_fields() -> Result<(), Box> { }, }, "#); - insta::assert_snapshot!(format!("{}", serde_json::to_string_pretty(&query_plan).unwrap_or_default()), @r#" + insta::assert_snapshot!(format!("{}", sonic_rs::to_string_pretty(&query_plan).unwrap_or_default()), @r#" { "kind": "QueryPlan", "node": { @@ -1250,7 +1250,7 @@ fn two_fields_same_requirement_different_order() -> Result<(), Box> { }, }, "#); - insta::assert_snapshot!(format!("{}", serde_json::to_string_pretty(&query_plan).unwrap_or_default()), @r#" + insta::assert_snapshot!(format!("{}", sonic_rs::to_string_pretty(&query_plan).unwrap_or_default()), @r#" { "kind": "QueryPlan", "node": { @@ -1521,7 +1521,7 @@ fn many() -> Result<(), Box> { }, }, "#); - insta::assert_snapshot!(format!("{}", serde_json::to_string_pretty(&query_plan).unwrap_or_default()), @r#" + insta::assert_snapshot!(format!("{}", sonic_rs::to_string_pretty(&query_plan).unwrap_or_default()), @r#" { "kind": "QueryPlan", "node": { diff --git a/lib/query-planner/src/tests/root_types.rs b/lib/query-planner/src/tests/root_types.rs index 511b0ae3e..7de0267a3 100644 --- a/lib/query-planner/src/tests/root_types.rs +++ b/lib/query-planner/src/tests/root_types.rs @@ -70,7 +70,7 @@ fn shared_root() -> Result<(), Box> { }, }, "#); - insta::assert_snapshot!(format!("{}", serde_json::to_string_pretty(&query_plan).unwrap_or_default()), @r#" + insta::assert_snapshot!(format!("{}", sonic_rs::to_string_pretty(&query_plan).unwrap_or_default()), @r#" { "kind": "QueryPlan", "node": {