sqlxo 0.9.1

sqlxo: small SQL query builder + derives for filterable ORM-ish patterns
Documentation
use serde_json::{
	json,
	Value,
};
use sqlxo::{
	and,
	blocks::{
		BuildableFilter,
		BuildableSort,
		SelectType,
	},
	order_by,
	web::WebReadFilter,
	Buildable,
	QueryBuilder,
	ReadQueryPlan,
};

use crate::helpers::{
	Item,
	ItemDto,
	ItemQuery,
	ItemSort,
	NormalizeString,
};

#[test]
fn dto_filter_combined_with_inline_filter() {
	let json: Value = json!({
		"filter": {
			 "differentName": { "like": "%Sternlampe%" }
		},
		"sort": null
	});

	let f: WebReadFilter<ItemDto> =
		serde_json::from_value(json).expect("invalid ItemDtoFilter");

	let plan: ReadQueryPlan<Item> =
		QueryBuilder::<Item>::from_web_read::<ItemDto>(&f)
			.r#where(and![ItemQuery::NameIsNull, ItemQuery::AmountEq(1000)])
			.order_by(order_by![ItemSort::ByNameAsc])
			.build();
	let sql = plan.sql(SelectType::Star).trim_start().normalize();

	assert!(
		sql.contains(r#"LEFT JOIN material AS "material__""#),
		"expected default auto-loaded join in SQL: {sql}"
	);
	assert!(
		sql.contains(
			r#"WHERE ("item"."name" LIKE $1 AND ("item"."name" IS NULL AND "item"."amount" = $2))"#
		),
		"expected combined filter in SQL: {sql}"
	);
	assert!(
		sql.contains(r#"ORDER BY "item"."name" ASC"#),
		"expected overridden sort in SQL: {sql}"
	);
}