In release 24.0.722 zal een eerste versie van server-side filtering voor SnelStart opgenomen zijn.
Met deze versie zullen talrijke geautomatiseerde tests uitgevoerd worden om de impact van eventuele negatieve gevolgen te achterhalen. Dit kan kort of lang duren, afhankelijk van de impact.
Zodra acceptabel stabiel zal deze versie in productie genomen worden op Invantive Cloud.
De controle gebeurt aan de hand van een script zoals:
declare
l_stmt varchar2;
l_cnt number;
l_test_cnt number;
begin
l_test_cnt := 0;
for r_tbe
in
( select tbe.catalog
, tbe.schema
, tbe.name
from systemtables@datadictionary tbe
left
outer
join ( select distinct table_name
from systemtablefunctionparameters@datadictionary
where provider_name = 'SnelStart'
and PRESENCE_REQUIRED = true
) tbefrp
on tbefrp.table_name = tbe.name /* Partial is sufficient. */
where tbe.provider_name = 'SnelStart'
and tbe.name not in ('NATIVEPLATFORMSCALARREQUESTS')
and tbe.name not in ('Prijsafspraken')
--
-- No required parameters.
--
and tbefrp.table_name is null
order
by tbe.name
)
loop
dbms_output.put_line
( 'Test all columns of '
|| r_tbe.name
|| ', starting at test case #'
|| to_char(l_test_cnt)
|| '.'
);
for r_cln
in
( select cln.name
, cln.database_data_type
from systemtablecolumns@datadictionary cln
where cln.table_catalog_name = r_tbe.catalog
and cln.table_schema_name = r_tbe.schema
and cln.table_name = r_tbe.name
order
by cln.name
)
loop
l_test_cnt := l_test_cnt + 1;
--
-- Test null.
--
begin
l_stmt :=
'select count(*)'
|| ' from ' || r_tbe.catalog || '.' || r_tbe.schema || '.' || r_tbe.name
|| ' where ' || r_cln.name || ' is null'
;
execute immediate l_stmt into l_cnt;
exception
when others
then
dbms_output.put_line
( 'Failed on null for '
|| r_tbe.name || '.' || r_cln.name
|| ': '
|| sqlerrm
);
end;
--
-- Test not null.
--
begin
l_stmt :=
'select count(*)'
|| ' from ' || r_tbe.catalog || '.' || r_tbe.schema || '.' || r_tbe.name
|| ' where ' || r_cln.name || ' is not null'
;
execute immediate l_stmt into l_cnt;
exception
when others
then
dbms_output.put_line
( 'Failed on not null for '
|| r_tbe.name || '.' || r_cln.name
|| ': '
|| sqlerrm
);
end;
--
-- Test equal.
--
begin
l_stmt :=
'select count(*)'
|| ' from ' || r_tbe.catalog || '.' || r_tbe.schema || '.' || r_tbe.name
|| ' where ' || r_cln.name || ' = '
|| case
when r_cln.database_data_type = 'boolean'
then 'true'
when r_cln.database_data_type = 'varchar2'
then '''value'''
when r_cln.database_data_type = 'char'
then '''N'''
when r_cln.database_data_type = 'guid'
then 'newid()'
when r_cln.database_data_type in ('date', 'datetime')
then 'trunc(sysdateutc)'
when r_cln.database_data_type in ('decimal', 'double', 'int32', 'int64', 'number', 'numeric')
then '1'
else 1/0
end
;
execute immediate l_stmt into l_cnt;
exception
when others
then
dbms_output.put_line
( 'Failed on equals for '
|| r_tbe.name || '.' || r_cln.name
|| ': '
|| sqlerrm
);
end;
end loop;
end loop;
end;
De volgende eenvoudige filters zijn getest:
To do:
Complexer Filter 1
Een complexer filter is getest met:
select m.dagboek_id
from grootboekmutaties m
join dagboeken d
on d.id = m.dagboek_id
where m.datum > trunc(sysdateutc)
and m.saldo > 400
and m.saldo < 500
and m.saldo != 450
and m.saldo != 451
and m.saldo != 452
and m.saldo != 453
and m.saldo != 454
and m.saldo != 455
and m.saldo != 456
and m.saldo != 457
and m.saldo != 458
and m.saldo != 459
and m.saldo != 460
met resulterende API URL’s:
https://b2bapi.snelstart.nl/v2/grootboekmutaties?$top=500&$filter=Datum+gt+datetime%272025-05-30T00%3A00%3A00%27+and+Saldo+gt+400+and+Saldo+ne+450+and+Saldo+ne+451+and+Saldo+ne+452+and+Saldo+ne+453+and+Saldo+ne+454+and+Saldo+ne+455+and+Saldo+ne+456+and+Saldo+ne+457+and+Saldo+ne+458+and+Saldo+ne+459+and+Saldo+ne+460+and+Saldo+lt+500
en
https://b2bapi.snelstart.nl/v2/dagboeken
Het ontbreken van een filter op dagboeken
is terecht: deze (kleine) tabel kent geen filtermogelijkheid.
Complexer Filter 2
Een andere complexere aanpak is het wisselen tussen join
-strategieeen.
De volgende query laat zien dat er van join-strategie gewisseld is:
select m.boekstuk
, r.id
from grootboekmutaties m
join relaties r
on r.id = m.relatiePublicIdentifier_id
where m.datum > trunc(sysdateutc) - 2
and m.saldo > 0
met resulterende API URL’s:
https://b2bapi.snelstart.nl/v2/grootboekmutaties?$top=500&$filter=Datum+gt+datetime%272025-05-28T00%3A00%3A00%27+and+Saldo+gt+0
en
https://b2bapi.snelstart.nl/v2/relaties?$top=500&$filter=%28Id+eq+guid%273ffa19ca-490b-4271-84c3-041de3b9a70c%27+or+Id+eq+guid%27cdf7c76c-56ab-4420-a8a5-6a571fed442a%27+or+Id+eq+guid%27bc6c14eb-8679-4f70-ba6f-75ce530d4c0a%27%29
waarbij in dit geval drie relaties opgezocht worden via een snelle route.
Complexer Filter 3
Echter, de SnelStart-driver ondersteunt momenteel het gebruik van maximaal 1 URL voor een dataverzoek en NIET het projecteren van een API-verzoek op meerdere API URL’s zoals de OData-driver.
Dit blijkt uit de query:
select m.boekstuk
, r.id
from grootboekmutaties m
join relaties r
on r.id = m.relatiePublicIdentifier_id
where m.datum > trunc(sysdateutc) - 7
and m.saldo > 0
met als gebruikte API URL’s:
https://b2bapi.snelstart.nl/v2/grootboekmutaties?$top=500&$filter=Datum+gt+datetime%272025-05-23T00%3A00%3A00%27+and+Saldo+gt+0
en
https://b2bapi.snelstart.nl/v2/relaties?$top=500