123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293(*********************************************************************************)(* Stog *)(* *)(* Copyright (C) 2012-2024 INRIA All rights reserved. *)(* Author: Maxence Guesdon, INRIA Saclay *)(* *)(* This program is free software; you can redistribute it and/or modify *)(* it under the terms of the GNU General Public License as *)(* published by the Free Software Foundation, version 3 of the License. *)(* *)(* 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 *)(* *)(* As a special exception, you have permission to link this program *)(* with the OCaml compiler and distribute executables, as long as you *)(* follow the requirements of the GNU GPL in regard to all of the *)(* software in the executable aside from the OCaml compiler. *)(* *)(* Contact: Maxence.Guesdon@inria.fr *)(* *)(*********************************************************************************)(** *)openTypes;;openFilter_types;;moduleXR=Xtmpl.Rewriteletfilter_of_stringstr=letlexbuf=Lexing.from_stringstrinFilter_parser.filterFilter_lexer.mainlexbuf;;moduleSet=Set.Make(structtypet=(doc_id*doc)letcompare(id1,_)(id2,_)=Tmap.compare_keyid1id2end)letfilter_predenvattsdata(doc_id,doc)=let(data,v)=letxmls=XR.from_stringsinlet(data,xmls)=XR.apply_to_xmlsdataenvxmlsin(data,XR.to_stringxmls)inlet(data,v_doc)=matchTypes.get_defdoc.doc_defsattwithNone->(data,"")|Some(_,body)->let(data,xmls)=XR.apply_to_xmlsdataenvbodyin(data,XR.to_stringxmls)in(data,v=v_doc);;letset_filter=letfpreddoc(data,set)=let(data,b)=preddatadocinletset=ifbthenSet.adddocsetelsesetin(data,set)infundatapredset->Set.fold(fpred)set(data,Set.empty);;letrecfilterdataenvset=functionPred(att,v)->set_filterdata(filter_predenvattv)set|Or(f1,f2)->let(data,s1)=filterdataenvsetf1inlet(data,s2)=filterdataenvsetf2in(data,Set.unions1s2)|And(f1,f2)->let(data,s2)=filterdataenvsetf2infilterdataenvs2f1|Notf->let(data,s)=filterdataenvsetfin(data,Set.diffsets)letfilter_docsdataenvtdocs=letset=List.fold_rightSet.adddocsSet.emptyinlet(data,set)=filterdataenvsettin(data,Set.elementsset);;