@prefix adms: <http://www.w3.org/ns/adms#> .
@prefix dbo: <https://dbpedia.org/ontology/> .
@prefix dct: <http://purl.org/dc/terms/> .
@prefix locn: <http://www.w3.org/ns/locn#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix rr: <http://www.w3.org/ns/r2rml#> .
@prefix schema: <https://schema.org/> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix legal: <http://www.w3.org/ns/legal#> .
@prefix m8g: <http://data.europa.eu/m8g/> .
@prefix fn: <http://www.w3.org/2005/xpath-functions/> .

######## D2RML NAMESPACES ###########

@prefix dr: <http://islab.ntua.gr/ns/d2rml#> .
@prefix drop: <http://islab.ntua.gr/ns/d2rml-op#> .
@prefix dris: <http://islab.ntua.gr/ns/d2rml-is#> .

######## STIRDATA TMP NAMESPACES ###########

@prefix nuts-item: <https://w3id.org/stirdata/resource/nuts/item/> .
@prefix lau-item: <https://w3id.org/stirdata/resource/lau/item/> .

@prefix sd-voc: <https://w3id.org/stirdata/vocabulary/> .
@prefix sd-voc-adminlevel: <https://w3id.org/stirdata/resource/adminUnitLevel/> .

@prefix sd-agency-md: <http://md.data.stirdata.eu/resource/agency/> .
@prefix sd-organization-md: <http://md.data.stirdata.eu/resource/organization/> .
@prefix sd-unit-md: <http://md.data.stirdata.eu/resource/unit/> .
@prefix sd-site-md: <http://md.data.stirdata.eu/resource/site/> .
@prefix sd-address-md: <http://md.data.stirdata.eu/resource/address/> .
@prefix sd-identifier-md: <http://md.data.stirdata.eu/resource/identifier/> .

@prefix sd-companytype-item-md: <http://md.data.stirdata.eu/resource/companyType/item/> .
@prefix sd-companystatus-item-md: <http://md.data.stirdata.eu/resource/companyStatus/item/> .

@prefix sd-nace-item-md:    <http://md.data.stirdata.eu/resource/nace/caem2/item/> .


######## EXECUTION ORDER ###########

<#Order>
   a dr:D2RMLSpecification ;
   dr:logicalDatasets ( 
                        <#CAETMMapping>
						<#NUTSMapping>
						<#PageMapping> 
						<#CAEMMapping>						
                        <#OrganizationsMapping> 
                        <#NutsMapping>
                      ) .

   
######## DATA SOURCES ###########

<#PageSource>
   a dris:HTTPSource ;
   dris:uri "https://date.gov.md/ckan/ro/dataset/11736-date-din-registrul-de-stat-al-unitatilor-de-drept-privind-intreprinderile-inregistrate-in-repu" .

<#CAETMSource>
   a dris:FileSource ;
   dris:path "caem_list.xlsx" .

<#NUTSSource>
   a dris:HTTPSource ;
   dris:uri "https://statistica.gov.md/public/files/Clasificatoare/NUTS.zip" ;
   dris:inContainerPath "NUTS.xlsx" .
#   a dris:FileSource ;
#   dris:path "D:/data/stirdata/data/md/NUTS.xlsx" .

<#BussinessRegistryOpenDataSource>
   a dris:HTTPSource .
#   a dris:FileSource ;
#   dris:path "d:/data/stirdata/data/md/2022.05.16 Company.xlsx" .

######## TRANSFORMATIONS ###########

<#CAEMTransformation>
   rr:logicalTable [ 
      dr:source <#CAEMModel> ;
      dr:sparqlQuery "PREFIX dct: <http://purl.org/dc/terms/> SELECT ?uri WHERE { ?uri dct:identifier \"{@@ACTIVITY_ID@@}\" } "; 
   ] . 
   
<#CAETMTransformation>
   rr:logicalTable [ 
      dr:source <#CAETMModel> ;
      dr:sparqlQuery "PREFIX skos: <http://www.w3.org/2004/02/skos/core#> SELECT ?label ?caetm2 WHERE { <https://w3id.org/stirdata/vocabulary/uCode/{@@UCODE@@}> skos:prefLabel ?label ; <https://w3id.org/stirdata/vocabulary/caetm2> ?caetm2 } "; 
   ] . 

<#NUTSTransformation>
   rr:logicalTable [ 
      dr:source <#NUTSModel> ;
      dr:sparqlQuery "PREFIX skos: <http://www.w3.org/2004/02/skos/core#> SELECT ?nuts ?label WHERE { ?caetm skos:notation \"{@@CAETM@@}\" ; skos:broadMatch ?nuts ; skos:prefLabel ?label } "; 
   ] . 
   
######## AUXILIARY SOURCE ###########

<#CAEMModel>
    a dris:AuxiliaryModel .
	
<#CAETMModel>
    a dris:AuxiliaryModel .

<#NUTSModel>
    a dris:AuxiliaryModel .

<#AdminLevelModel>
    a dris:AuxiliaryModel .
	
######## MAIN DATASETS AND MAPPINGS ###########

<#CAEMMapping>  
   rr:logicalTable [ 
      a dr:ExcelTable;
      dr:inputProcessor dr:XLSXStreamProcessor ;   
      dr:source <#BussinessRegistryOpenDataSource> ;
      dr:sheet "Clasificare nelicenţiate";
      dr:offset 1 ;
   ] ;
   
   dr:triplesMap [
      dr:logicalOutput <#CAEMModel> ;
      
	  rr:subjectMap [ 
         rr:template  "{@sd-nace-item-md}{C}" ;
         dr:condition [
            rr:column "D" ;
	        drop:eq 2 ;
	     ] ;
      ] ;
	  
	  rr:predicateObjectMap [
	     rr:predicate dct:identifier ;
		 rr:objectMap [
		    rr:column "A" ;
			rr:termType rr:Literal ;
		 ]
	  ] ;
   ] .
   
<#CAETMMapping>  
   rr:logicalTable [ 
      a dr:ExcelTable;
      dr:source <#CAETMSource> ;
      dr:sheetName "Sheet1";
   ] ;

   dr:definedColumns (  
   [ 
      dr:name "FIX_UCODE" ;
      dr:function drop:extractMatch ; 
      dr:parameterBinding [ 
	     dr:parameter "input" ;
         rr:column "C"  ;
      ] ; 
	  dr:parameterBinding [ 
	     dr:parameter "regex" ;
         rr:constant "^([0-9]{3,4}).*$"  ;
      ] ; 
   ]
   [ 
      dr:name "UCODE_LENGTH" ;
      dr:function fn:string-length ; 
      dr:parameterBinding [ 
	     dr:parameter "input" ;
         rr:column "FIX_UCODE"  ;
      ] ; 
   ]
   [ 
      dr:name "UCODE" ;
      dr:function drop:if ; 
      dr:parameterBinding [ 
	     dr:parameter "condition" ;
         rr:constant "_x1 == 3"  ;
      ] ; 
      dr:parameterBinding [ 
	     dr:parameter "_x1" ;
         rr:column "UCODE_LENGTH"  ;
      ] ;      
      dr:parameterBinding [ 
	     dr:parameter "then" ;
         rr:template "0{FIX_UCODE}"  ;
      ] ;       
      dr:parameterBinding [ 
	     dr:parameter "else" ;
         rr:column "FIX_UCODE"  ;
      ] ;       
   ]   
  [ 
      dr:name "FIX_CAETM" ;
      dr:function drop:extractMatch ; 
      dr:parameterBinding [ 
	     dr:parameter "input" ;
         rr:column "A"  ;
      ] ; 
	  dr:parameterBinding [ 
	     dr:parameter "regex" ;
         rr:constant "^([0-9]{6,7}).*$"  ;
      ] ; 
   ]   
   [ 
      dr:name "CAETM_LENGTH" ;
      dr:function fn:string-length ; 
      dr:parameterBinding [ 
	     dr:parameter "input" ;
         rr:column "FIX_CAETM"  ;
      ] ; 
   ]
   [ 
      dr:name "CAETM" ;
      dr:function drop:if ; 
      dr:parameterBinding [ 
	     dr:parameter "condition" ;
         rr:constant "_x1 == 6"  ;
      ] ; 
      dr:parameterBinding [ 
	     dr:parameter "_x1" ;
         rr:column "CAETM_LENGTH"  ;
      ] ;      
      dr:parameterBinding [ 
	     dr:parameter "then" ;
         rr:template "0{FIX_CAETM}"  ;
      ] ;       
      dr:parameterBinding [ 
	     dr:parameter "else" ;
         rr:column "FIX_CAETM"  ;
      ] ;       
   ] 
   [ 
      dr:name "CAETM_PREFIX" ;
      dr:function fn:substring ; 
      dr:parameterBinding [ 
	     dr:parameter "input" ;
         rr:column "CAETM"  ;
      ] ; 
      dr:parameterBinding [ 
	     dr:parameter "start" ;
         rr:constant 0  ;
      ] ;      
      dr:parameterBinding [ 
	     dr:parameter "length" ;
         rr:constant 2  ;
      ] ;       
   ] 
   [ 
      dr:name "CAETM2" ;
      dr:function drop:if ; 
      dr:parameterBinding [ 
	     dr:parameter "condition" ;
         rr:constant "_x1 == 6"  ;
      ] ; 
      dr:parameterBinding [ 
	     dr:parameter "_x1" ;
         rr:column "CAETM_LENGTH"  ;
      ] ;      
      dr:parameterBinding [ 
	     dr:parameter "then" ;
         rr:template "MD_{CAETM_PREFIX}01000"  ;
      ] ;       
      dr:parameterBinding [ 
	     dr:parameter "else" ;
         rr:template "MD_{CAETM_PREFIX}00000"  ;
      ] ;       
   ]
   ) ;
   
   dr:triplesMap [
      dr:logicalOutput <#CAETMModel> ;
	  
	  rr:subjectMap [
		 rr:template "{@sd-voc}uCode/{UCODE}" ;
	  ] ;
	  
	  rr:predicateObjectMap [
	     rr:predicate skos:prefLabel ;
		 rr:objectMap [
		    rr:column "D" ;
			rr:termType rr:Literal ;
		 ]
	  ] ;

	  rr:predicateObjectMap [
	     rr:predicate sd-voc:caetm ;
		 rr:objectMap [
		    rr:column "CAETM" ;
			rr:termType rr:Literal ;
		 ] ;
	  ] ;

	  rr:predicateObjectMap [
	     rr:predicate sd-voc:caetm2 ;
		 rr:objectMap [
		    rr:column "CAETM2" ;
			rr:termType rr:Literal ;
		 ] ;
	  ]

   ] .
   
<#NUTSMapping>  
   rr:logicalTable [ 
      a dr:ExcelTable;
      dr:source <#NUTSSource> ;
      dr:sheetName "Rom";
      dr:offset 1 ;
   ] ;
   
   dr:definedColumns ( [
      dr:name "CODE" ;
      dr:function drop:extractMatch;
      dr:parameterBinding [
         dr:parameter "input";
         rr:column "C" ;
      ] ;
      dr:parameterBinding [
         dr:parameter "regex";
         rr:constant "^MD ([0-9]{3})$" ;
      ] ;
   ] [
      dr:name "LCODE_FIX" ;
      dr:function drop:extractMatch;
      dr:parameterBinding [
         dr:parameter "input";
         rr:column "D" ;
      ] ;
      dr:parameterBinding [
         dr:parameter "regex";
         rr:constant "^([0-9]+?)(:?\\.0)?$" ;
      ] ;
   ] 
   [ 
      dr:name "LCODE_LENGTH" ;
      dr:function fn:string-length ; 
      dr:parameterBinding [ 
	     dr:parameter "input" ;
         rr:column "LCODE_FIX"  ;
      ] ; 
   ]
   [ 
      dr:name "LCODE" ;
      dr:function drop:if ; 
      dr:parameterBinding [ 
	     dr:parameter "condition" ;
         rr:constant "_x1 == 6"  ;
      ] ; 
      dr:parameterBinding [ 
	     dr:parameter "_x1" ;
         rr:column "LCODE_LENGTH"  ;
      ] ;      
      dr:parameterBinding [ 
	     dr:parameter "then" ;
         rr:template "0{LCODE_FIX}"  ;
      ] ;       
      dr:parameterBinding [ 
	     dr:parameter "else" ;
         rr:column "LCODE_FIX"  ;
      ] ;       
   ]
   ) ;

   dr:triplesMap [
      dr:logicalOutput <#NUTSModel> ;
          
      rr:subjectMap [ 
         rr:template  "{@lau-item}MD_{LCODE}" ;
      ] ;

      rr:predicateObjectMap [ 
         rr:predicate  skos:notation ;
         rr:objectMap [
            rr:template "MD_{LCODE}";
            rr:termType rr:Literal ; 
         ] ;
      ] ;
      rr:predicateObjectMap [ 
      rr:predicate  skos:prefLabel ;
      rr:objectMap [
         dr:cases ( [
            rr:column "E" ;
            rr:termType rr:Literal ; 
            dr:condition [
              rr:column "C" ;
			  drop:eq "MD 114"; 
            ]
		] [
            rr:column "F";
            rr:termType rr:Literal ; 
		] );
      ] ;
   ] ;
      rr:predicateObjectMap [ 
         rr:predicate  skos:broadMatch ;
         rr:objectMap [
            rr:template "{@nuts-item}MD{CODE.match#1}";
            rr:termType rr:IRI ; 
        ] ;
      ] ;
   ] .

<#PageMapping>  
   dr:logicalArray [ 
      a dr:RegExItemArray ;
      dr:source <#PageSource> ;
      dr:iterator "(?s)(^.*$)" ;
   ] ;

   dr:definedColumn [
     dr:name "LINK" ;
     dr:function drop:extractMatch ; 
     dr:selector dr:lastElement ;
     dr:parameterBinding [ 
	    dr:parameter "input" ;
        rr:column "##1"  ;
     ] ;
     dr:parameterBinding [  
	    dr:parameter "regex" ;
		rr:constant "<a href=\"(.*?any\\.xlsx)\"" ;
     ] ;    
   ] ;

   dr:triplesMap [
      dr:logicalOutput dris:CurrentD2RMLDocument ;
	  
	  rr:subject <#BussinessRegistryOpenDataSource> ;
	  
	  rr:predicateObjectMap [
	     rr:predicate dris:uri ;
		 rr:objectMap [
		    rr:template "{LINK}" ;
			rr:termType rr:Literal ;
		 ] ;
	  ] ;
   ] .
   
<#OrganizationsMapping>  
    rr:logicalTable [ 
      a dr:ExcelTable;
      dr:inputProcessor dr:XLSXStreamProcessor ;
      dr:source <#BussinessRegistryOpenDataSource> ;
      dr:sheetName "Company";
      dr:offset 2 ;
#     dr:limit 1;
   ] ;
   
   dr:definedColumns ( 
   [
      dr:name "REGISTRATION_DATE" ;
      dr:function drop:extractMatch ; 
      dr:parameterBinding [ 
         dr:parameter "input" ;
         rr:column "B" ;   
      ] ;
      dr:parameterBinding [ 
         dr:parameter "regex" ;
         rr:constant "^(\\d\\d?)/(\\d\\d?)/(\\d\\d\\d\\d)$"  ;
      ] ;          
   ] 
   [
      dr:name "REGISTRATION_DAYLENGTH" ;
      dr:function fn:string-length ; 
      dr:parameterBinding [ 
         dr:parameter "input" ;
         rr:column "REGISTRATION_DATE.match#1" ;   
      ] ;
   ] 
   [
      dr:name "REGISTRATION_MONTHLENGTH" ;
      dr:function fn:string-length ; 
      dr:parameterBinding [ 
         dr:parameter "input" ;
         rr:column "REGISTRATION_DATE.match#2" ;   
      ] ;
   ]
   [
      dr:name "LIQUIDATION_DATE" ;
      dr:function drop:extractMatch ; 
      dr:parameterBinding [ 
         dr:parameter "input" ;
         rr:column "L" ;   
      ] ;
      dr:parameterBinding [ 
         dr:parameter "regex" ;
         rr:constant "^(\\d\\d?)/(\\d\\d?)/(\\d\\d\\d\\d)$"  ;
      ] ;          
   ] 
   [
      dr:name "LIQUIDATION_DAYLENGTH" ;
      dr:function fn:string-length ; 
      dr:parameterBinding [ 
         dr:parameter "input" ;
         rr:column "LIQUIDATION_DATE.match#1" ;   
      ] ;
   ] 
   [
      dr:name "LIQUIDATION_MONTHLENGTH" ;
      dr:function fn:string-length ; 
      dr:parameterBinding [ 
         dr:parameter "input" ;
         rr:column "LIQUIDATION_DATE.match#2" ;   
      ] ;
   ]
   [
      dr:name "ACTIVITY" ;
      dr:function fn:tokenize ; 
      dr:parameterBinding [ 
         dr:parameter "input" ;
         rr:column "J" ;   
      ] ;
      dr:parameterBinding [ 
         dr:parameter "pattern" ;
         rr:constant ", "  ;
      ] ;          
   ] 
   ) ;
  
   dr:transformations ( 
   [
      dr:dataref <#CAEMTransformation> ;
      dr:transformationName "CAEMTransformation";
      dr:parameterBinding [ 
         dr:parameter "ACTIVITY_ID" ;
         rr:column "ACTIVITY" ;
      ]  ;
   ]
   [
      dr:dataref <#CAETMTransformation> ;
      dr:transformationName "CAETMTransformation";
      dr:parameterBinding [ 
         dr:parameter "UCODE" ;
         rr:column "F" ;
      ]  ;
   ] 
   [
      dr:dataref <#NUTSTransformation> ;
      dr:transformationName "NUTSTransformation";
      dr:parameterBinding [ 
         dr:parameter "CAETM" ;
         rr:column "CAETMTransformation~~caetm2" ;
      ]  ;
   ] 
   ) ;  
   
   dr:triplesMap [
      # ID - CLASS
      rr:subjectMap [ 
         rr:template  "{@sd-organization-md}{A}" ;
         rr:class legal:LegalEntity ;
      ] ;
   
      # ASP REGISTRATION IDENTIFIER
      rr:predicateObjectMap [
         rr:predicate legal:legalIdentifier ;
         rr:objectMap [
            rr:parentTriplesMap [
               rr:subjectMap [
                  rr:template "{@sd-identifier-md}asp/{A}" ;
                  rr:class adms:Identifier ;
               ] ;

               # DATE ISSUED
               rr:predicateObjectMap [
                  rr:predicate dct:issued;
                  rr:objectMap [

                     dr:cases ( [
                        rr:template "{REGISTRATION_DATE.match#3}-{REGISTRATION_DATE.match#2}-{REGISTRATION_DATE.match#1}" ;
                        rr:datatype xsd:date;
                        dr:condition [
                           rr:column "REGISTRATION_DAYLENGTH" ;
                           drop:eq 2;
                           dr:booleanOperator drop:and ;
                           dr:condition [
                              rr:column "REGISTRATION_MONTHLENGTH" ;
                              drop:eq 2;
                           ] ;
                        ] ;
                     ] [
                        rr:template "{REGISTRATION_DATE.match#3}-0{REGISTRATION_DATE.match#2}-{REGISTRATION_DATE.match#1}" ;
                        rr:datatype xsd:date;
                        dr:condition [
                           rr:column "REGISTRATION_DAYLENGTH" ;
                           drop:eq 2;
                           dr:booleanOperator drop:and ;
                           dr:condition [
                              rr:column "REGISTRATION_MONTHLENGTH" ;
                              drop:eq 1;
                           ] ;
                        ] ;
                     ] [
                        rr:template "{REGISTRATION_DATE.match#3}-{REGISTRATION_DATE.match#2}-0{REGISTRATION_DATE.match#1}" ;
                        rr:datatype xsd:date;
                        dr:condition [
                           rr:column "REGISTRATION_DAYLENGTH" ;
                           drop:eq 1;
                           dr:booleanOperator drop:and ;
                           dr:condition [
                              rr:column "REGISTRATION_MONTHLENGTH" ;
                              drop:eq 2;
                           ] ;
                        ] ;
                     ] [
                        rr:template "{REGISTRATION_DATE.match#3}-0{REGISTRATION_DATE.match#2}-0{REGISTRATION_DATE.match#1}" ;
                        rr:datatype xsd:date;
                     ] )
                  ] ;
               ] ;

               # REGISTRATION NUMBER 
               rr:predicateObjectMap [
               rr:predicate skos:notation;
                  rr:objectMap [
                     rr:column "A" ;
                     rr:termType rr:Literal;
                  ] ;
               ] ;

               # ISSUING BODY
               rr:predicateObjectMap [
                  rr:predicate dct:creator;
                  rr:objectMap [
                     rr:constant sd-agency-md:asp ;
                  ] ;
               ] ;
            ] ;
         ] ;
      ] ;     
   
      # COMPANY NAME
      rr:predicateObjectMap [ 
         rr:predicate  legal:legalName ;
         rr:objectMap  [ 
            rr:column "C" ;
            rr:termType  rr:Literal ;
         ] ;
      ] ;   
   
      # LEGAL FORM (TEMPORARY UNTIL SKOS VOCABULARY DECIDED)
      rr:predicateObjectMap [ 
         rr:predicate  legal:companyType ;
         rr:objectMap  [ 
            dr:cases ( [
               rr:template "{@sd-companytype-item-md}ScRL" ;
               rr:termType  rr:IRI ;
               dr:condition [
                  rr:column "D" ;
                  drop:eq "Societate cu răspundere limitată" ;
               ] ;
            ] [
               rr:template "{@sd-companytype-item-md}II" ;
               rr:termType  rr:IRI ;
               dr:condition [
                  rr:column "D" ;
                  drop:eq "Întreprindere individuală" ;
               ] ;
            ] [
               rr:template "{@sd-companytype-item-md}CdP" ;
               rr:termType  rr:IRI ;
               dr:condition [
                  rr:column "D" ;
                  drop:eq "Cooperativă de producţie (inclusiv agricole)" ;
               ] ;
            ] [
               rr:template "{@sd-companytype-item-md}SdAdTD" ;
               rr:termType  rr:IRI ;
               dr:condition [
                  rr:column "D" ;
                  drop:eq "Societate pe acţiuni de tip deschis" ;
               ] ;
            ] [
               rr:template "{@sd-companytype-item-md}SdAdTI" ;
               rr:termType  rr:IRI ;
               dr:condition [
                  rr:column "D" ;
                  drop:eq "Societate pe acţiuni de tip închis" ;
               ] ;
            ] [
               rr:template "{@sd-companytype-item-md}IM" ;
               rr:termType  rr:IRI ;
               dr:condition [
                  rr:column "D" ;
                  drop:eq "Întreprindere municipală" ;
               ] ;
            ] [
               rr:template "{@sd-companytype-item-md}CdC" ;
               rr:termType  rr:IRI ;
               dr:condition [
                  rr:column "D" ;
                  drop:eq "Cooperativă de consum (inclusiv prestarea serviciilor)" ;
               ] ;
            ] [
               rr:template "{@sd-companytype-item-md}IdS" ;
               rr:termType  rr:IRI ;
               dr:condition [
                  rr:column "D" ;
                  drop:eq "Întreprindere de stat" ;
               ] ;
            ] [
               rr:template "{@sd-companytype-item-md}CdI" ;
               rr:termType  rr:IRI ;
               dr:condition [
                  rr:column "D" ;
                  drop:eq "Cooperative de întreprinzător" ;
               ] ;
            ] [
               rr:template "{@sd-companytype-item-md}IPu" ;
               rr:termType  rr:IRI ;
               dr:condition [
                  rr:column "D" ;
                  drop:eq "Instituţie publică" ;
               ] ;
            ] [
               rr:template "{@sd-companytype-item-md}AGT" ;
               rr:termType  rr:IRI ;
               dr:condition [
                  rr:column "D" ;
                  drop:eq "Asociaţia gospodăriilor ţărăneşti (de fermieri)" ;
               ] ;
            ] [
               rr:template "{@sd-companytype-item-md}SpA" ;
               rr:termType  rr:IRI ;
               dr:condition [
                  rr:column "D" ;
                  drop:eq "Societate pe acţiuni" ;
               ] ;
            ] [
               rr:template "{@sd-companytype-item-md}RINS" ;
               rr:termType  rr:IRI ;
               dr:condition [
                  rr:column "D" ;
                  drop:eq "Reprezentanţa întreprinderii nerezidente străine" ;
               ] ;
            ] [
               rr:template "{@sd-companytype-item-md}IPr" ;
               rr:termType  rr:IRI ;
               dr:condition [
                  rr:column "D" ;
                  drop:eq "Instituţie privată" ;
               ] ;
            ] [
               rr:template "{@sd-companytype-item-md}SINS" ;
               rr:termType  rr:IRI ;
               dr:condition [
                  rr:column "D" ;
                  drop:eq "Sucursala întreprinderii nerezidente străine" ;
               ] ;
            ] [
               rr:template "{@sd-companytype-item-md}CM" ;
               rr:termType  rr:IRI ;
               dr:condition [
                  rr:column "D" ;
                  drop:eq "Cooperative mixte" ;
               ] ;
            ] [
               rr:template "{@sd-companytype-item-md}IdA" ;
               rr:termType  rr:IRI ;
               dr:condition [
                  rr:column "D" ;
                  drop:eq "Întreprindere de arendă	" ;
               ] ;
            ] [
               rr:template "{@sd-companytype-item-md}SiNC" ;
               rr:termType  rr:IRI ;
               dr:condition [
                  rr:column "D" ;
                  drop:eq "Societate în nume colectiv" ;
               ] ;
            ] [
               rr:template "{@sd-companytype-item-md}A" ;
               rr:termType  rr:IRI ;
               dr:condition [
                  rr:column "D" ;
                  drop:eq "Asociaţie" ;
               ] ;
            ] [
               rr:template "{@sd-companytype-item-md}Col" ;
               rr:termType  rr:IRI ;
               dr:condition [
                  rr:column "D" ;
                  drop:eq "Colhoz" ;
               ] ;
            ] [
               rr:template "{@sd-companytype-item-md}I" ;
               rr:termType  rr:IRI ;
               dr:condition [
                  rr:column "D" ;
                  drop:eq "Instituţie" ;
               ] ;
            ] [
               rr:template "{@sd-companytype-item-md}SiC" ;
               rr:termType  rr:IRI ;
               dr:condition [
                  rr:column "D" ;
                  drop:eq "Societate în comandită" ;
               ] ;
            ] [
               rr:template "{@sd-companytype-item-md}UdPJ" ;
               rr:termType  rr:IRI ;
               dr:condition [
                  rr:column "D" ;
                  drop:eq "Uniuni de persoane juridice" ;
               ] ;
            ] [
               rr:template "{@sd-companytype-item-md}Con" ;
               rr:termType  rr:IRI ;
               dr:condition [
                  rr:column "D" ;
                  drop:eq "Concern" ;
               ] ;
            ] [
               rr:template "{@sd-companytype-item-md}U" ;
               rr:termType  rr:IRI ;
               dr:condition [
                  rr:column "D" ;
                  drop:eq "Uniune" ;
               ] ;
            ] [
               rr:template "{@sd-companytype-item-md}MO" ;
               rr:termType  rr:IRI ;
               dr:condition [
                  rr:column "D" ;
                  drop:eq "Mişcare obştească" ;
               ] ;
            ] [
               rr:template "{@sd-companytype-item-md}AO" ;
               rr:termType  rr:IRI ;
               dr:condition [
                  rr:column "D" ;
                  drop:eq "Asociaţie obştească" ;
               ] ;
            ] 
           )
		] ;
      ] ;
	  
      # FOUNDATION DATE 
      rr:predicateObjectMap [ 
         rr:predicate  m8g:registrationDate ;
         rr:objectMap [
            dr:cases ( [
               rr:template "{REGISTRATION_DATE.match#3}-{REGISTRATION_DATE.match#2}-{REGISTRATION_DATE.match#1}" ;
               rr:datatype xsd:date;
               dr:condition [
                  rr:column "REGISTRATION_DAYLENGTH" ;
                  drop:eq 2;
                  dr:booleanOperator drop:and ;
                  dr:condition [
                     rr:column "REGISTRATION_MONTHLENGTH" ;
                     drop:eq 2;
                  ] ;
               ] ;
            ] [
               rr:template "{REGISTRATION_DATE.match#3}-0{REGISTRATION_DATE.match#2}-{REGISTRATION_DATE.match#1}" ;
               rr:datatype xsd:date;
               dr:condition [
                  rr:column "REGISTRATION_DAYLENGTH" ;
                  drop:eq 2;
                  dr:booleanOperator drop:and ;
                  dr:condition [
                     rr:column "REGISTRATION_MONTHLENGTH" ;
                     drop:eq 1;
                  ] ;
               ] ;
           ] [
               rr:template "{REGISTRATION_DATE.match#3}-{REGISTRATION_DATE.match#2}-0{REGISTRATION_DATE.match#1}" ;
               rr:datatype xsd:date;
               dr:condition [
                  rr:column "REGISTRATION_DAYLENGTH" ;
                  drop:eq 1;
                  dr:booleanOperator drop:and ;
                  dr:condition [
                     rr:column "REGISTRATION_MONTHLENGTH" ;
                     drop:eq 2;
                  ] ;
               ] ;
           ] [
              rr:template "{REGISTRATION_DATE.match#3}-0{REGISTRATION_DATE.match#2}-0{REGISTRATION_DATE.match#1}" ;
              rr:datatype xsd:date;
           ] )
         ] ;
      ] ;        

      # DISSOLUTION DATE 
      rr:predicateObjectMap [ 
         rr:predicate  schema:dissolutionDate ;
         rr:objectMap [
            dr:cases ( [
               rr:template "{LIQUIDATION_DATE.match#3}-{LIQUIDATION_DATE.match#2}-{LIQUIDATION_DATE.match#1}" ;
               rr:datatype xsd:date;
               dr:condition [
                  rr:column "LIQUIDATION_DAYLENGTH" ;
                  drop:eq 2;
                  dr:booleanOperator drop:and ;
                  dr:condition [
                     rr:column "LIQUIDATION_MONTHLENGTH" ;
                     drop:eq 2;
                  ] ;
               ] ;
            ] [
               rr:template "{LIQUIDATION_DATE.match#3}-0{LIQUIDATION_DATE.match#2}-{LIQUIDATION_DATE.match#1}" ;
               rr:datatype xsd:date;
               dr:condition [
                  rr:column "LIQUIDATION_DAYLENGTH" ;
                  drop:eq 2;
                  dr:booleanOperator drop:and ;
                  dr:condition [
                     rr:column "LIQUIDATION_MONTHLENGTH" ;
                     drop:eq 1;
                  ] ;
               ] ;
           ] [
               rr:template "{LIQUIDATION_DATE.match#3}-{LIQUIDATION_DATE.match#2}-0{LIQUIDATION_DATE.match#1}" ;
               rr:datatype xsd:date;
               dr:condition [
                  rr:column "LIQUIDATION_DAYLENGTH" ;
                  drop:eq 1;
                  dr:booleanOperator drop:and ;
                  dr:condition [
                     rr:column "LIQUIDATION_MONTHLENGTH" ;
                     drop:eq 2;
                  ] ;
               ] ;
           ] [
              rr:template "{LIQUIDATION_DATE.match#3}-0{LIQUIDATION_DATE.match#2}-0{LIQUIDATION_DATE.match#1}" ;
              rr:datatype xsd:date;
           ] )
         ] ;
      ] ;        


      # ACTIVITY   
      rr:predicateObjectMap [
         rr:predicate legal:companyActivity ;
         rr:objectMap [
            rr:column "CAEMTransformation~~uri" ;
            rr:termType rr:IRI ;
         ] ;
      ]  ;  
   
      # ADDRESS (use postal address only : fix after defining d2rml conditions)
      rr:predicateObjectMap [ 
         rr:predicate m8g:registeredAddress ;
         rr:objectMap [
            rr:parentTriplesMap [
               rr:subjectMap [
                  rr:template "{@sd-address-md}{A}";
                  rr:class locn:Address ;
               ] ;
		   	
               rr:predicateObjectMap [ 
                  rr:predicate  locn:fullAddress ;
                  rr:objectMap  [ 
                     rr:column  "E" ;
                     rr:termType  rr:Literal ;
                  ] ;
               ] ;

#               rr:predicateObjectMap [ 
#                  rr:predicate  locn:thoroughfare ;
#                  rr:objectMap  [ 
#                     rr:column "POSTAL_ADDRESS.match#1" ;
#                     rr:termType  rr:Literal ;
#                  ] ;      
#               ] ;   
#
#               rr:predicateObjectMap [ 
#                  rr:predicate  locn:locatorDesignator ;
#                  rr:objectMap  [ 
#                     rr:column "POSTAL_ADDRESS.match#2" ;
#                     rr:termType  rr:Literal ;
#                  ] ;      
#               ]  ;   
#
#               rr:predicateObjectMap [ 
#                  rr:predicate  locn:locatorName ;
#                  rr:objectMap  [ 
#                     rr:template "{POSTAL_ADDRESS.match#3}<< {POSTAL_ADDRESS.match#4}>>" ;
#                     rr:termType  rr:Literal ;
#                  ] ;      
#               ] ;   
#
#               rr:predicateObjectMap [ 
#                  rr:predicate  locn:postCode ;
#                  rr:objectMap  [ 
#                     rr:column "POSTAL_POST_CODE" ;
#                     rr:termType  rr:Literal ;
#                  ] ;      
#               ] ;   
#			
               rr:predicateObjectMap [ 
                  rr:predicate  locn:postName ;
                  rr:objectMap  [ 
                     rr:column "CAETMTransformation~~label" ;
                     rr:termType  rr:Literal ;
                  ] ;      
               ] ;                       
			
               rr:predicateObjectMap [ 
                  rr:predicate  locn:adminUnitL1 ;
                  rr:objectMap  [ 
                     rr:constant "MD" ;
                     rr:termType  rr:Literal ;
                  ] ;      
               ] ;                    

               rr:predicateObjectMap [ 
                  rr:predicate  locn:adminUnitL2 ;
                 rr:objectMap  [ 
                    rr:column "NUTSTransformation~~label" ;
                    rr:termType  rr:Literal ;
                 ]
               ] ;   
			   
               rr:predicateObjectMap [ 
                  rr:predicate  m8g:adminUnit ;
                  rr:objectMap  [ 
                     rr:constant <http://publications.europa.eu/resource/authority/country/MDA> ;
                     rr:termType  rr:IRI ;
                 ] ;    
               ] ;

               rr:predicateObjectMap [ 
                 rr:predicate  m8g:adminUnit ;
                 rr:objectMap  [ 
                    rr:column "NUTSTransformation~~nuts" ;
                    rr:termType  rr:IRI ;
                 ]
               ] ;

               rr:predicateObjectMap [ 
                  rr:predicate  m8g:adminUnit ;
                  rr:objectMap  [ 
                     rr:template "{@lau-item}{CAETMTransformation~~caetm2}" ;
                     rr:termType  rr:IRI ;
                  ]
               ] ;
            ] ;
         ] ;
      ]
   ]  ;
   
   dr:triplesMap [
      dr:logicalOutput <#AdminLevelModel> ;
      rr:subjectMap [ 
         rr:constant <http://publications.europa.eu/resource/authority/country/MDA> ;
         rr:class sd-voc-adminlevel:Country ;
      ] ;
   ] ;  
   
   dr:triplesMap [
      dr:logicalOutput <#AdminLevelModel> ;
      rr:subjectMap [ 
         rr:column "NUTSTransformation~~nuts" ;
         rr:class sd-voc-adminlevel:NUTS-3 ;
      ] ;
   ] ;
   
   dr:triplesMap [
      dr:logicalOutput <#AdminLevelModel> ;
      rr:subjectMap [ 
         rr:template "{@lau-item}{CAETMTransformation~~caetm2}" ;
         rr:class sd-voc-adminlevel:LAU ;
      ] ;
   ] .
   

<#NutsMapping>
   rr:logicalTable [ 
      dr:source <#AdminLevelModel> ;
      dr:sparqlQuery "SELECT ?uri ?type WHERE { ?uri a ?type } "; 
   ] ;
   
   dr:triplesMap[ 
      rr:subjectMap [ 
         rr:column "uri";
         rr:class m8g:AdminUnit ;
      ] ;

      rr:predicateObjectMap [ 
         rr:predicate  m8g:code ;
         rr:objectMap  [ 
            rr:column "uri" ;
            rr:termType  rr:IRI ;
         ]
      ] ;   

      rr:predicateObjectMap [ 
         rr:predicate  m8g:level ;
         rr:objectMap  [ 
            rr:column "type" ;
            rr:termType rr:IRI ;
         ]
      ] ;   
   ] .