123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559(*********************************************************************************)(* OCaml-RDF *)(* *)(* Copyright (C) 2012-2024 Institut National de Recherche en Informatique *)(* et en Automatique. All rights reserved. *)(* *)(* This program is free software; you can redistribute it and/or modify *)(* it under the terms of the GNU Lesser General Public License version *)(* 3 as published by the Free Software Foundation. *)(* *)(* This program is distributed in the hope that it will be useful, *)(* but WITHOUT ANY WARRANTY; without even the implied warranty of *)(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *)(* GNU General Public License for more details. *)(* *)(* You should have received a copy of the GNU General Public License *)(* along with this program; if not, write to the Free Software *)(* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA *)(* 02111-1307 USA *)(* *)(* Contact: Maxence.Guesdon@inria.fr *)(* *)(*********************************************************************************)(** Expanding IRIs and triples in query abstract syntax tree. *)openSparql_typesletmap_opt=Misc.map_opt;;moduleSMap=Xml.SMap;;typeenv={base:Iri.t;prefixes:Iri.tSMap.t;}typedataset={from:Ds.namelist;from_named:Ds.NameSet.t}letcreate_envbase={base;prefixes=SMap.empty}letiriref_a=Iriref{ir_loc=Loc.dummy_loc;ir_iri=Rdf_.type_;};;letexpand_relative_irienvs=Iri.resolve~base:env.bases;;letexpand_irienv=function|Irirefir->Iri{iri_loc=ir.ir_loc;iri_iri=expand_relative_irienvir.ir_iri;}|(Iri_)asi->i|PrefixedNamepname->letbase=matchpname.pname_ns.pname_ns_namewith""->env.base|s->trySMap.findsenv.prefixeswithNot_found->Sparql_algebra.error(Sparql_algebra.Unknown_prefixpname.pname_ns)inletiri=matchpname.pname_localwithNone->base|Somel->lets=(Iri.to_stringbase^l.pname_local_name)inIri.of_stringsinIri{iri_loc=pname.pname_loc;iri_iri=iri};;letexpand_query_prolog_decl(env,acc)=function|(BaseDecliriref)ast|(PrefixDecl({pname_ns_name=""},iriref)ast)->letbase=expand_relative_irienviriref.ir_iriinletenv={envwithbase}in(env,t::acc)|PrefixDecl(pname_ns,iriref)ast->letiri=expand_relative_irienviriref.ir_iriinletprefixes=SMap.addpname_ns.pname_ns_nameirienv.prefixesin({envwithprefixes},t::acc);;letexpand_query_prologenvdecls=let(env,l)=List.fold_leftexpand_query_prolog_decl(env,[])declsin(env,List.revl);;letexpand_rdf_literalenvt=matcht.rdf_lit_typewithNone->t|Someiri->matchexpand_irienviriwithPrefixedName_|Iriref_->assertfalse|Irii->{rdf_lit_loc=t.rdf_lit_loc;rdf_lit={t.rdf_litwithTerm.lit_type=Somei.iri_iri};rdf_lit_type=Some(Irii);};;letexpand_data_block_valueenv=function|DataBlockValueIriiri->DataBlockValueIri(expand_irienviri)|DataBlockValueRdflit->DataBlockValueRdf(expand_rdf_literalenvlit)|DataBlockValueNumericlit->DataBlockValueNumeric(expand_rdf_literalenvlit)|DataBlockValueBooleanlit->DataBlockValueBoolean(expand_rdf_literalenvlit)|DataBlockValueUndef->DataBlockValueUndef;;letexpand_data_full_block_valueenv=function|Nil->Nil|Valuel->Value(List.map(expand_data_block_valueenv)l);;letexpand_inline_data_one_varenvt={idov_loc=t.idov_loc;idov_var=t.idov_var;idov_data=List.map(expand_data_block_valueenv)t.idov_data;};;letexpand_inline_data_fullenvt={idf_loc=t.idf_loc;idf_vars=t.idf_vars;idf_values=List.map(expand_data_full_block_valueenv)t.idf_values;};;letexpand_datablockenv=function|InLineDataOneVari->InLineDataOneVar(expand_inline_data_one_varenvi)|InLineDataFulli->InLineDataFull(expand_inline_data_fullenvi)letexpand_values_clauseenvd=map_opt(expand_datablockenv)d;;letexpand_var_or_irienv=function|VIVarv->VIVarv|VIIriiri->VIIri(expand_irienviri);;letrecexpand_select_varenvt={sel_var_loc=t.sel_var_loc;sel_var_expr=map_opt(expand_expressionenv)t.sel_var_expr;sel_var=t.sel_var;}andexpand_select_varsenv=function|SelectAll->SelectAll|SelectVarsl->SelectVars(List.map(expand_select_varenv)l)andexpand_select_clauseenvt={sel_flag=t.sel_flag;sel_vars=expand_select_varsenvt.sel_vars;}andexpand_source_selector=expand_iriandexpand_dataset_clauseenv=function|DefaultGraphClauses->DefaultGraphClause(expand_source_selectorenvs)|NamedGraphClauses->NamedGraphClause(expand_source_selectorenvs)andexpand_arg_listenvt={argl_loc=t.argl_loc;argl_distinct=t.argl_distinct;argl=List.map(expand_expressionenv)t.argl;}andexpand_function_callenvt={func_loc=t.func_loc;func_iri=expand_irienvt.func_iri;func_args=expand_arg_listenvt.func_args;}andexpand_exprenv=function|EIriiri->EIri(expand_irienviri)|EBin(e1,op,e2)->EBin(expand_expressionenve1,op,expand_expressionenve2)|EIn(e,l)->EIn(expand_expressionenve,List.map(expand_expressionenv)l)|ENotIn(e,l)->ENotIn(expand_expressionenve,List.map(expand_expressionenv)l)|EUMinuse->EUMinus(expand_expressionenve)|ENote->ENot(expand_expressionenve)|EBicc->EBic(expand_built_in_callenvc)|EFuncallc->EFuncall(expand_function_callenvc)|ELitlit->ELit(expand_rdf_literalenvlit)|ENumericlit->ENumeric(expand_rdf_literalenvlit)|EBooleanlit->EBoolean(expand_rdf_literalenvlit)|EVarv->EVarvandexpand_expressionenvt={expr_loc=t.expr_loc;expr=expand_exprenvt.expr;}andexpand_aggregateenv=function|Bic_COUNT(b,eopt)->Bic_COUNT(b,map_opt(expand_expressionenv)eopt)|Bic_SUM(b,e)->Bic_SUM(b,expand_expressionenve)|Bic_MIN(b,e)->Bic_MIN(b,expand_expressionenve)|Bic_MAX(b,e)->Bic_MAX(b,expand_expressionenve)|Bic_AVG(b,e)->Bic_AVG(b,expand_expressionenve)|Bic_SAMPLE(b,e)->Bic_SAMPLE(b,expand_expressionenve)|Bic_GROUP_CONCAT(b,e,s_opt)->Bic_GROUP_CONCAT(b,expand_expressionenve,s_opt)andexpand_built_in_callenv=function|Bic_aggagg->Bic_agg(expand_aggregateenvagg)|Bic_fun(name,l)->Bic_fun(name,List.map(expand_expressionenv)l)|Bic_BOUNDv->Bic_BOUNDv|Bic_EXISTSg->Bic_EXISTS(expand_group_graph_patternenvg)|Bic_NOTEXISTSg->Bic_NOTEXISTS(expand_group_graph_patternenvg)andexpand_group_varenvt={grpvar_loc=t.grpvar_loc;grpvar_expr=map_opt(expand_expressionenv)t.grpvar_expr;grpvar=t.grpvar;}andexpand_group_conditionenv=function|GroupBuiltInCallc->GroupBuiltInCall(expand_built_in_callenvc)|GroupFunctionCallc->GroupFunctionCall(expand_function_callenvc)|GroupVargv->GroupVar(expand_group_varenvgv)andexpand_constraintenv=function|ConstrBuiltInCallc->ConstrBuiltInCall(expand_built_in_callenvc)|ConstrFunctionCallc->ConstrFunctionCall(expand_function_callenvc)|ConstrExpre->ConstrExpr(expand_expressionenve)andexpand_having_conditionenvt=expand_constraintenvtandexpand_order_conditionenv=function|OrderAsce->OrderAsc(expand_expressionenve)|OrderDesce->OrderDesc(expand_expressionenve)|OrderConstrc->OrderConstr(expand_constraintenvc)|OrderVarv->OrderVarvandexpand_limit_offset_clauseenvt={limoff_loc=t.limoff_loc;limoff_offset=t.limoff_offset;limoff_limit=t.limoff_limit;}andexpand_solution_modifierenvt={solmod_loc=t.solmod_loc;solmod_group=List.map(expand_group_conditionenv)t.solmod_group;solmod_having=List.map(expand_having_conditionenv)t.solmod_having;solmod_order=map_opt(List.map(expand_order_conditionenv))t.solmod_order;solmod_limoff=map_opt(expand_limit_offset_clauseenv)t.solmod_limoff;}andexpand_bindenvt={bind_loc=t.bind_loc;bind_expr=expand_expressionenvt.bind_expr;bind_var=t.bind_var;}andexpand_service_graph_patternenvt={servgp_loc=t.servgp_loc;servgp_silent=t.servgp_silent;servgp_name=expand_var_or_irienvt.servgp_name;servgp_pat=expand_group_graph_patternenvt.servgp_pat;}andexpand_graph_graph_patternenvt={graphgp_loc=t.graphgp_loc;graphgp_name=expand_var_or_irienvt.graphgp_name;graphgp_pat=expand_group_graph_patternenvt.graphgp_pat;}andexpand_graph_pattern_eltenv=function|Triplesl->Triples(expand_triples_blockenvl)|Unionl->Union(List.map(expand_group_graph_patternenv)l)|Optionalg->Optional(expand_group_graph_patternenvg)|Minusg->Minus(expand_group_graph_patternenvg)|GGPg->GGP(expand_graph_graph_patternenvg)|Services->Service(expand_service_graph_patternenvs)|Filterc->Filter(expand_constraintenvc)|Bindb->Bind(expand_bindenvb)|InlineDatad->InlineData(expand_datablockenvd)andexpand_graph_termenv=function|GraphTermIriiri->GraphTermIri(expand_irienviri)|GraphTermLitlit->GraphTermLit(expand_rdf_literalenvlit)|GraphTermNumericlit->GraphTermNumeric(expand_rdf_literalenvlit)|GraphTermBooleanlit->GraphTermBoolean(expand_rdf_literalenvlit)|GraphTermBlank({bnode_label=None}asb)->(* set a fresh id, needed to distinguish this anonymous blank
from others un solution union *)letlabel=Sparql_ms.gen_blank_id()inGraphTermBlank{bwithbnode_label=Somelabel}|GraphTermBlankb->GraphTermBlankb|GraphTermNil->GraphTermNil|GraphTermNode_->assertfalseandexpand_var_or_termenv=function|Varv->Varv|GraphTermt->GraphTerm(expand_graph_termenvt)andexpand_path_one_in_prop_setenv=function|PathOneInIriiri->PathOneInIri(expand_irienviri)|PathOneInA->PathOneInIriiriref_a|PathOneInNotIriiri->PathOneInNotIri(expand_irienviri)|PathOneInNotA->PathOneInNotIriiriref_aandexpand_path_primaryenv=function|PathIriiri->PathIri(expand_irienviri)|PathA->PathIriiriref_a|PathNegPropSetl->PathNegPropSet(List.map(expand_path_one_in_prop_setenv)l)|Pathp->Path(expand_pathenvp)andexpand_path_eltenvt={pelt_loc=t.pelt_loc;pelt_primary=expand_path_primaryenvt.pelt_primary;pelt_mod=t.pelt_mod;}andexpand_path_elt_or_inverseenv=function|Elte->Elt(expand_path_eltenve)|Inve->Inv(expand_path_eltenve)andexpand_path_sequenceenvl=List.map(expand_path_elt_or_inverseenv)landexpand_pathenvl=List.map(expand_path_sequenceenv)landexpand_verbenv=function|VerbPathp->VerbPath(expand_pathenvp)|VerbVarv->VerbVarv|VerbIriiri->VerbIri(expand_irienviri)|VerbA->VerbIriiriref_aandexpand_triples_nodeenv=function|TNodeCollectionl->TNodeCollection(List.map(expand_graph_nodeenv)l)|TNodeBlankl->TNodeBlank(List.map(expand_prop_object_listenv)l)andexpand_graph_nodeenv=function|GraphNodeVTt->GraphNodeVT(expand_var_or_termenvt)|GraphNodeTriplest->GraphNodeTriples(expand_triples_nodeenvt)andexpand_objectenvt=expand_graph_nodeenvtandexpand_prop_object_listenvt={propol_loc=t.propol_loc;propol_verb=expand_verbenvt.propol_verb;propol_objects=List.map(expand_objectenv)t.propol_objects;}andexpand_triples_blockenvt={triples_loc=t.triples_loc;triples=List.map(expand_triples_same_subjectenv)t.triples;}andexpand_triples_same_subjectenv=function|TriplesVar(t,l)->TriplesVar(expand_var_or_termenvt,List.map(expand_prop_object_listenv)l)|TriplesNode(t,l)->TriplesNode(expand_triples_nodeenvt,List.map(expand_prop_object_listenv)l)andexpand_ggp_subenvt={ggp_sub_loc=t.ggp_sub_loc;ggp_sub_elts=List.map(expand_graph_pattern_eltenv)t.ggp_sub_elts;}andexpand_group_graph_patternenv=function|SubSelects->SubSelect(expand_sub_selectenvs)|GGPSubg->GGPSub(expand_ggp_subenvg)andexpand_sub_selectenvt={subsel_loc=t.subsel_loc;subsel_select=expand_select_clauseenvt.subsel_select;subsel_where=expand_group_graph_patternenvt.subsel_where;subsel_modifier=expand_solution_modifierenvt.subsel_modifier;subsel_values=expand_values_clauseenvt.subsel_values;};;letexpand_select_queryenvt={select_select=expand_select_clauseenvt.select_select;select_dataset=List.map(expand_dataset_clauseenv)t.select_dataset;select_where=expand_group_graph_patternenvt.select_where;select_modifier=expand_solution_modifierenvt.select_modifier;}letexpand_triples_templateenvl=List.map(expand_triples_same_subjectenv)lletexpand_construct_template=expand_triples_templateletexpand_construct_whereenv=function|Constr_ggpp->Constr_ggp(expand_group_graph_patternenvp)|Constr_templatet->Constr_template(expand_triples_templateenvt)letexpand_construct_queryenvt={constr_template=map_opt(expand_construct_templateenv)t.constr_template;constr_dataset=List.map(expand_dataset_clauseenv)t.constr_dataset;constr_where=expand_construct_whereenvt.constr_where;constr_modifier=expand_solution_modifierenvt.constr_modifier;}letexpand_describe_queryenvt={desc_sel=List.map(expand_var_or_irienv)t.desc_sel;desc_dataset=List.map(expand_dataset_clauseenv)t.desc_dataset;desc_where=map_opt(expand_group_graph_patternenv)t.desc_where;desc_modifier=expand_solution_modifierenvt.desc_modifier;}letexpand_ask_queryenvt={ask_dataset=List.map(expand_dataset_clauseenv)t.ask_dataset;ask_where=expand_group_graph_patternenvt.ask_where;ask_modifier=expand_solution_modifierenvt.ask_modifier;}letexpand_quads_not_triplesenvqnt={quadsnt_loc=qnt.quadsnt_loc;quadsnt_graph=expand_var_or_irienvqnt.quadsnt_graph;quadsnt_triples=map_opt(expand_triples_templateenv)qnt.quadsnt_triples;}letexpand_quads1env(qnt,topt)=(expand_quads_not_triplesenvqnt,map_opt(expand_triples_templateenv)topt)letexpand_quadsenvq={quads_loc=q.quads_loc;quads_triples=map_opt(expand_triples_templateenv)q.quads_triples;quads_list=List.map(expand_quads1env)q.quads_list;}letexpand_quad_data=expand_quadsletexpand_quad_pattern=expand_quadsletexpand_update_modifyenvt={umod_loc=t.umod_loc;umod_iri=map_opt(expand_irienv)t.umod_iri;umod_delete=map_opt(expand_quad_patternenv)t.umod_delete;umod_insert=map_opt(expand_quad_patternenv)t.umod_insert;umod_using=List.map(fun(b,iri,loc)->(b,expand_irienviri,loc))t.umod_using;umod_where=expand_group_graph_patternenvt.umod_where;}letexpand_update_actionenv=function|Update_load|Update_clear|Update_drop|Update_add|Update_move|Update_copy|Update_createasx->x|Update_insert_dataqd->Update_insert_data(expand_quad_dataenvqd)|Update_delete_dataqd->Update_delete_data(expand_quad_dataenvqd)|Update_delete_whereqp->Update_delete_where(expand_quad_patternenvqp)|Update_modifyt->Update_modify(expand_update_modifyenvt)letexpand_update_queryenvt=List.map(expand_update_actionenv)tletexpand_query_kindenv=function|Selectq->Select(expand_select_queryenvq)|Constructq->Construct(expand_construct_queryenvq)|Describeq->Describe(expand_describe_queryenvq)|Askq->Ask(expand_ask_queryenvq)|Updateq->Update(expand_update_queryenvq);;letbuild_dataset=letiterenvds=function|DefaultGraphClause(PrefixedName_)|NamedGraphClause(PrefixedName_)->assertfalse|DefaultGraphClause(Iri_)|NamedGraphClause(Iri_)->assertfalse|DefaultGraphClause(Irirefr)->{dswithfrom=(`I(expand_relative_irienvr.ir_iri))::ds.from}|NamedGraphClause(Irirefr)->{dswithfrom_named=Ds.NameSet.add(`I(expand_relative_irienvr.ir_iri))ds.from_named}inletempty_ds={from=[];from_named=Ds.NameSet.empty}inletbuildenvclauses=List.fold_left(iterenv)empty_dsclausesinfunenv->functionSelectq->buildenvq.select_dataset|Constructq->buildenvq.constr_dataset|Describeq->buildenvq.desc_dataset|Askq->buildenvq.ask_dataset|Update_->assertfalse;;letexpand_prologdefault_base_iriprolog=letenv=create_envdefault_base_iriinexpand_query_prologenvprologletexpand_querydefault_base_iriq=let(env,q_prolog)=expand_prologdefault_base_iriq.q_prologinletq_kind=expand_query_kindenvq.q_kindinletq_values=expand_values_clauseenvq.q_valuesinletds=build_datasetenvq.q_kindin(env.base,ds,{q_prolog;q_kind;q_values})letexpand_update_querydefault_base_iriq=let(env,q_prolog)=expand_prologdefault_base_iriq.q_prologinletq_kind=matchq.q_kindwith|Updatel->Update(List.map(expand_update_actionenv)l)|_->assertfalsein(env.base,{q_prolog;q_kind;q_values=q.q_values})(* dataset for update actions
let update_iter env ds (named, iri, _loc) =
let iri =
match expand_iri env iri with
Iri iri -> iri.iri_iri
| _ -> assert false
in
if named then
{ ds with from_named = Iri.Set.add iri }
else
{ ds with from = iri :: ds.from }
in
let update_build env using =
List.fold_left (update_iter env) empty_ds using
in
*)