@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/> .

######## 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: <http://data.europa.eu/nuts/code/> .
@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-cy: <http://cy.data.stirdata.eu/resource/agency/> .
@prefix sd-organization-cy: <http://cy.data.stirdata.eu/resource/organization/> .
@prefix sd-unit-cy: <http://cy.data.stirdata.eu/resource/unit/> .
@prefix sd-site-cy: <http://cy.data.stirdata.eu/resource/site/> .
@prefix sd-address-cy: <http://cy.data.stirdata.eu/resource/address/> .
@prefix sd-identifier-cy: <http://cy.data.stirdata.eu/resource/identifier/> .

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

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

<#Order>
   a dr:D2RMLSpecification ;
   dr:logicalDatasets ( 
                        <#DCATMapping>
                        <#OrganizationsMapping>
                        <#RegisteredOfficeMapping>  
                        <#NutsMapping>
                      ) .
                      
######## DATA SOURCES ###########

<#CountriesSource>
   a dris:HTTPSource ;
   dris:cacheable true ;
   dris:uri "https://stirdata-semantic.ails.ece.ntua.gr/api/content/index/countries/search?text={@@TEXT@@}&keys=label,alt-label&type=match-phrase&fields=label-en,nal,alpha2" .
   
<#NutsSource>    
   a dris:HTTPSource ;
   dris:cacheable true ;
   dris:uri "https://stirdata-semantic.ails.ece.ntua.gr/api/content/index/nuts/search?text={@@TEXT@@}&fields=label&type=match&keys=notation" .
   
<#PostCodeSource>
   a dris:HTTPSource ;
   dris:cacheable true ;
   dris:uri "https://apps.islab.ntua.gr/geo/api/postcode?country-code={@@COUNTRY@@}&postcode={@@POSTCODE@@}" .
   
#<#RegionSource>
#   a dris:HTTPSource ;
#   dris:cacheable true ;
#   dris:uri "https://stirdata-semantic.ails.ece.ntua.gr/api/content/index/lau/search?text={@@TEXT@@}&fields=label&type=match-phrase&keys=label" .

   
#<#BussinessRegistryOpenDataSource>
#   a dris:HTTPSource ;
#   dris:uri "https://www.data.gov.cy/node/4016/dataset/download" .
#   a dris:FileSource ;
#   dris:path "D:/data/stirdata/data/cy/--All-2022-03-21_0929.zip" .

<#DCATSource> 
   a dris:HTTPSource ;
   dris:uri "https://data.europa.eu/api/hub/repo/datasets/340dbc18-9d24-4156-857a-607617412b83.ttl?useNormalizedId=true&locale=en" .
#    a dris:FileSource ;
#	dris:path "d:/data/stirdata/340dbc18-9d24-4156-857a-607617412b83.ttl" .
   
#<#OrganizationsSource>
#   a dris:FileSource ;
#   dris:containerSource <#BussinessRegistryOpenDataSource> ;
#   dris:path "organisations_43.csv" .

<#OrganizationsSource>
   a dris:HTTPSource .

#<#RegisteredOfficeSource>
#   a dris:FileSource ;
#   dris:containerSource <#BussinessRegistryOpenDataSource> ;
#   dris:path "registered_office_43.csv" .
#   a dris:FileSource ;
#   dris:path "d:/data/stirdata/data/cy/registered_office_45.csv" .

<#RegisteredOfficeSource>
   a dris:HTTPSource .

#<#OrganizationOfficialsSource>
#   a dris:FileSource ;
#   dris:containerSource <#BussinessRegistryOpenDataSource> ;
#   dris:path "organisation_officials_27.csv" .


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

<#CountryTransformation>
   dr:logicalArray [ 
      a dr:JSONItemArray ;
      dr:source <#CountriesSource> ;
	  dr:iterator "$";
      dr:limit 1;
   ] .

<#PostCodeTransformation>
   dr:logicalArray [ 
      a dr:JSONItemArray ;
      dr:source <#PostCodeSource> ;
	  dr:iterator "$";
	  dr:limit 1;
   ] . 

<#NutsTransformation>
   dr:logicalArray [ 
      a dr:JSONItemArray ;
      dr:source <#NutsSource> ;
	  dr:iterator "$";
	  dr:limit 1;
   ] . 
   
#<#RegionTransformation>
#   dr:logicalArray [ 
#      a dr:JSONItemArray ;
#      dr:source <#RegionSource> ;
#	  dr:iterator "$";
#	  dr:limit 1;
#   ] . 
      

######## AUXILIARY SOURCE ###########

<#AdminLevelModel>
    a dris:AuxiliaryModel .

######## MAIN MAPPINGS ###########

<#DCATMapping>
   rr:logicalTable [
      a dr:SPARQLQueryResult ;
      dr:source <#DCATSource> ;
      dr:sparqlSelectQuery  "SELECT ?downloadURL WHERE { ?p a <http://www.w3.org/ns/dcat#Distribution> ; <http://www.w3.org/ns/dcat#downloadURL> ?downloadURL . }" ;
   ] ;
   
   dr:triplesMap [
      dr:logicalOutput dris:CurrentD2RMLDocument ;
	  
	  rr:subjectMap [
	     dr:cases ( [
		    rr:constant <#OrganizationsSource> ;
			dr:condition [
			   rr:column "downloadURL" ;
			   drop:matches "^https://www\\.data\\.gov\\.cy/sites/default/files/organisations_.*$" ;
			]
		 ] [
		    rr:constant <#RegisteredOfficeSource> ;
			dr:condition [
			   rr:column "downloadURL" ;
			   drop:matches "^https://www\\.data\\.gov\\.cy/sites/default/files/registered_office_.*$" ;
			]
		 ] )
	  ] ;
	  
	  rr:predicateObjectMap [
	     rr:predicate dris:uri ;
		 rr:objectMap [
		    rr:column "downloadURL" ;
			rr:termType rr:Literal ;
		 ] ;
	  ] ;
   ] .

<#OrganizationsMapping>  
# ++ ORGANISATION_NAME
# ++ REGISTRATION_NO
# ++ ORGANISATION_TYPE_CODE
# -- ORGANISATION_TYPE
# ++ ORGANISATION_SUB_TYPE
#    NAME_STATUS_CODE
#    NAME_STATUS
# ++ REGISTRATION_DATE
# +  ORGANISATION_STATUS 
# ++ ORGANISATION_STATUS_DATE
# ++ ADDRESS_SEQ_NO

   rr:logicalTable [ 
      a dr:CSVTable;
      dr:source <#OrganizationsSource> ;
	  dr:headerRecord true;
	  dr:delimiter ",";
	  dr:quoteCharacter "\"";
#      dr:offset 8 ;
#	  dr:limit 10 ;
   ] ;
   
   dr:definedColumns ( [ 
      dr:name "REGISTRATION_DATE_SPLIT" ;
      dr:function drop:extractMatch ; 
      dr:parameterBinding [ 
	     dr:parameter "input" ;
         rr:column "REGISTRATION_DATE"  ;
      ] ;
      dr:parameterBinding [			
	     dr:parameter "regex" ;
         rr:constant "^([0-9]{2})/([0-9]{2})/([0-9]{4})$"  ;
      ] ; 
   ] [ 
      dr:name "ORGANISATION_STATUS_DATE_SPLIT" ;
      dr:function drop:extractMatch ; 
      dr:parameterBinding [ 
	     dr:parameter "input" ;
         rr:column "ORGANISATION_STATUS_DATE"  ;
      ] ;
      dr:parameterBinding [			
	     dr:parameter "regex" ;
         rr:constant "^([0-9]{2})/([0-9]{2})/([0-9]{4})$"  ;
      ] ; 
   ] ) ;
   
   dr:triplesMap [
      # ID - CLASS
      rr:subjectMap [ 
         rr:template  "{@sd-organization-cy}{ORGANISATION_TYPE_CODE}{REGISTRATION_NO}" ;
         rr:class legal:LegalEntity ;
         #filter out wrong entries
#         dr:condition [
#            rr:column "REGISTRATION_NO" ;
#            drop:matches "^[0-9]+$"
#         ]	  
      ] ;
   
#   # SYSTEM IDENTIFIER
#   rr:predicateObjectMap [ 
#      rr:predicate  dcterms:identifier ;
#      rr:objectMap  [ 
#         dr:cases ( [
#            rr:template  "ΕΕ {REGISTRATION_NO}" ;
#            rr:termType  rr:Literal ;
#		    dr:condition [
#		       rr:column "ORGANISATION_TYPE_CODE" ;
#			   drop:eq "B" ;
#		    ]
#	     ] [
#            rr:template  "ΗΕ {REGISTRATION_NO}" ;
#            rr:termType  rr:Literal ;
#		    dr:condition [
#		       rr:column "ORGANISATION_TYPE_CODE" ;
#			   drop:eq "C" ;
#		    ]
#	     ] [
#            rr:template  "BN {REGISTRATION_NO}" ;
#            rr:termType  rr:Literal ;
#		    dr:condition [
#		       rr:column "ORGANISATION_TYPE_CODE" ;
#			   drop:eq "N" ;
#		    ]
#	     ] [
#            rr:template  "ΑΕ {REGISTRATION_NO}" ;
#            rr:termType  rr:Literal ;
#		    dr:condition [
#		       rr:column "ORGANISATION_TYPE_CODE" ;
#			   drop:eq "O" ;
#		    ]
#	     ] [
#            rr:template  "Σ {REGISTRATION_NO}" ;
#            rr:termType  rr:Literal ;
#		    dr:condition [
#		       rr:column "ORGANISATION_TYPE_CODE" ;
#			   drop:eq "P" ;
#		    ]
#	     ] ) ; 
#      ] ;
#   ] ;   
   
      # REGISTRATION IDENTIFIER
      rr:predicateObjectMap [
         rr:predicate legal:legalIdentifier ;
         rr:objectMap [
            rr:parentTriplesMap [
               rr:subjectMap [
                  rr:template "{@sd-identifier-cy}drcor/{ORGANISATION_TYPE_CODE}{REGISTRATION_NO}" ;
                  rr:class adms:Identifier ;
               ] ;

               # DATE ISSUED
               rr:predicateObjectMap [
                  rr:predicate dct:issued;
                  rr:objectMap [
                     rr:template "{REGISTRATION_DATE_SPLIT.match#3}-{REGISTRATION_DATE_SPLIT.match#2}-{REGISTRATION_DATE_SPLIT.match#1}" ;
                     rr:datatype xsd:date;
                  ] ;
               ] ;

               # REGISTRATION NUMBER 
               rr:predicateObjectMap [
                  rr:predicate skos:notation;
                  rr:objectMap [
                     dr:cases ( [
                        rr:template  "ΕΕ {REGISTRATION_NO}" ;
                        rr:termType  rr:Literal ;
		                dr:condition [
		                   rr:column "ORGANISATION_TYPE_CODE" ;
			               drop:eq "B" ;
                      ]
	                 ] [
                        rr:template  "ΗΕ {REGISTRATION_NO}" ;
                        rr:termType  rr:Literal ;
		                dr:condition [
		                   rr:column "ORGANISATION_TYPE_CODE" ;
			               drop:eq "C" ;
		                ]
	                 ] [
                        rr:template  "BN {REGISTRATION_NO}" ;
                        rr:termType  rr:Literal ;
	                    dr:condition [
		                   rr:column "ORGANISATION_TYPE_CODE" ;
			               drop:eq "N" ;
		                ]
	                 ] [
                        rr:template  "ΑΕ {REGISTRATION_NO}" ;
                        rr:termType  rr:Literal ;
		                dr:condition [
		                   rr:column "ORGANISATION_TYPE_CODE" ;
			               drop:eq "O" ;
		                ]
	                 ] [
                        rr:template  "Σ {REGISTRATION_NO}" ;
                        rr:termType  rr:Literal ;
		                dr:condition [
		                   rr:column "ORGANISATION_TYPE_CODE" ;
			               drop:eq "P" ;
		                ]
	                 ] ) ;
			      ] ;
               ] ;

               # ISSUING BODY
               rr:predicateObjectMap [
                  rr:predicate dct:creator;
                  rr:object sd-agency-cy:drcor ;
               ] ;
            ] ;
         ] ;
      ] ;    
   
      # COMPANY NAME
      rr:predicateObjectMap [ 
         rr:predicate  legal:legalName ;
         rr:objectMap  [ 
            rr:column "ORGANISATION_NAME" ;
            rr:termType  rr:Literal ;
         ] ;
      ] ;   
   
#   # JURISDICTION (ASSUME CYPRUS FOR ALL)
#   rr:predicateObjectMap [ 
#      rr:predicate  dbo:jurisdiction ;
#      rr:objectMap  [ 
#         rr:constant <http://publications.europa.eu/resource/authority/country/CYP> ;
#         rr:termType  rr:IRI ;
#      ] ;
#   ] ;  
   
      # LEGAL FORM (TEMPORARY UNTIL SKOS VOCABULARY DECIDED)
      rr:predicateObjectMap [ 
         rr:predicate  legal:companyType ;
         rr:objectMap  [ 
            dr:cases ( [
               rr:template "{@sd-companytype-item-cy}C1" ;
               rr:termType  rr:IRI ;
               dr:condition [
                  rr:column "ORGANISATION_TYPE_CODE" ;
                  drop:eq "C" ;
                  dr:booleanOperator drop:and ;
                  dr:operand [
                     rr:column "ORGANISATION_SUB_TYPE" ;
                     drop:eq "Ιδιωτική" ;
                  ]
               ] ;
            ] [
               rr:template "{@sd-companytype-item-cy}C2" ;
               rr:termType  rr:IRI ;
               dr:condition [
                  rr:column "ORGANISATION_TYPE_CODE" ;
                  drop:eq "C" ;
                  dr:booleanOperator drop:and ;
                  dr:operand [
                     rr:column "ORGANISATION_SUB_TYPE" ;
                     drop:eq "Δημόσια" ;
                  ]
               ] ;
            ] [
               rr:template "{@sd-companytype-item-cy}C3" ;
               rr:termType  rr:IRI ;
               dr:condition [
                  rr:column "ORGANISATION_TYPE_CODE" ;
                  drop:eq "C" ;
                  dr:booleanOperator drop:and ;
                  dr:operand [
                     rr:column "ORGANISATION_SUB_TYPE" ;
                     drop:eq "Δι΄ Εγγυήσεως Χωρίς Κεφάλαιο" ;
                  ]            
               ] ;
            ] [
               rr:template "{@sd-companytype-item-cy}C4" ;
               rr:termType  rr:IRI ;
               dr:condition [
                  rr:column "ORGANISATION_TYPE_CODE" ;
                  drop:eq "C" ;
                  dr:booleanOperator drop:and ;
                  dr:operand [
                     rr:column "ORGANISATION_SUB_TYPE" ;
                     drop:eq "Δι΄ Εγγυήσεως" ;
                  ]
               ] ;
            ] [
               rr:template "{@sd-companytype-item-cy}P1" ;
               rr:termType  rr:IRI ;
               dr:condition [
                  rr:column "ORGANISATION_TYPE_CODE" ;
                  drop:eq "P" ;
                  dr:booleanOperator drop:and ;
                  dr:operand [
                     rr:column "ORGANISATION_SUB_TYPE" ;
                     drop:eq "Ομόρρυθμος" ;
                  ]
               ] ;
            ] [
               rr:template "{@sd-companytype-item-cy}P2" ;
               rr:termType  rr:IRI ;
               dr:condition [
                  rr:column "ORGANISATION_TYPE_CODE" ;
                  drop:eq "P" ;
                  dr:booleanOperator drop:and ;
                  dr:operand [
                     rr:column "ORGANISATION_SUB_TYPE" ;
                     drop:eq "Ετερόρρυθμος" ;
                  ]
               ] ;
            ] [
               rr:template "{@sd-companytype-item-cy}BN1" ;
               rr:termType  rr:IRI ;
               dr:condition [
                  rr:column "ORGANISATION_TYPE_CODE" ;
                  drop:eq "BN" ;
                  dr:booleanOperator drop:and ;
                  dr:operand [
                     rr:column "ORGANISATION_SUB_TYPE" ;
                     drop:eq "Ομόρρυθμος" ;
                  ]
               ] ;
            ] [
               rr:template "{@sd-companytype-item-cy}BN2" ;
               rr:termType  rr:IRI ;
               dr:condition [
                  rr:column "ORGANISATION_TYPE_CODE" ;
                  drop:eq "BN" ;
                  dr:booleanOperator drop:and ;
                  dr:operand [
                     rr:column "ORGANISATION_SUB_TYPE" ;
                     drop:eq "Ετερόρρυθμος" ;
                  ]
               ] ;
            ] [
               rr:template "{@sd-companytype-item-cy}B" ;
               rr:termType  rr:IRI ;
               dr:condition [
                  rr:column "ORGANISATION_TYPE_CODE" ;
                  drop:eq "B" ;
               ] ;
            ] [
               rr:template "{@sd-companytype-item-cy}O" ;
               rr:termType  rr:IRI ;
               dr:condition [
                  rr:column "ORGANISATION_TYPE_CODE" ;
                  drop:eq "O" ;
               ] ;
            ] ) ;
         ] ;
      ] ;   
   
      # FOUNDATION DATE (REGISTRATION DATE)
      rr:predicateObjectMap [ 
         rr:predicate  m8g:registrationDate ;
         rr:objectMap  [ 
            rr:template "{REGISTRATION_DATE_SPLIT.match#3}-{REGISTRATION_DATE_SPLIT.match#2}-{REGISTRATION_DATE_SPLIT.match#1}" ; ;
            rr:datatype  xsd:date ;      
         ] ;
      ] ;
   
      # DISSOLUTION DATE (DELETION DATE)
      rr:predicateObjectMap [ 
         rr:predicate  schema:dissolutionDate ;
         rr:objectMap  [ 
            rr:template "{ORGANISATION_STATUS_DATE_SPLIT.match#3}-{ORGANISATION_STATUS_DATE_SPLIT.match#2}-{ORGANISATION_STATUS_DATE_SPLIT.match#1}" ;
            rr:datatype  xsd:date ;    
            dr:condition [
               rr:column "ORGANISATION_STATUS" ;
               drop:eq "Διαγραμμένη" ;
               dr:booleanOperator drop:or ;
               dr:operand [
                  rr:column "ORGANISATION_STATUS" ;
                  drop:eq "Διάλυση λόγω Ολοκλήρωσης Εκκαθάρισης" ;
               ] ;
               dr:operand [
                  rr:column "ORGANISATION_STATUS" ;
                  drop:eq "Διάλυση λόγω Ολοκλήρωσης Εκούσιας Εκκαθάρισης" ;
               ] ;
               dr:operand [
                  rr:column "ORGANISATION_STATUS" ;
                  drop:eq "Διαλύθηκε λόγω συγχώνευσης" ;
               ] ;
               dr:operand [
                  rr:column "ORGANISATION_STATUS" ;
                  drop:eq "Εκκαθάριση με Διάταγμα Δικαστηρίου" ;
               ] ;
               dr:operand [
                  rr:column "ORGANISATION_STATUS" ;
                  drop:eq "Εκούσια Εκκαθάριση από Μετόχους" ;
               ] ;
               dr:operand [
                  rr:column "ORGANISATION_STATUS" ;
                  drop:eq "Εκούσια Εκκαθάριση από Πιστωτές" ;
               ] ;
               dr:operand [
                  rr:column "ORGANISATION_STATUS" ;
                  drop:eq "Αφαιρέθηκε από το Μητρώο ΕΕ με απόφαση Ανωτάτου Δικαστηρίου" ;
               ] ;
            ] ;
         ] ;
      ] ;
   
   # BUSINESS ADDRESS
#   rr:predicateObjectMap [ 
#      rr:predicateMap [
#         rr:constant org:hasSite;
#         dr:condition [
#            rr:column "ADDRESS_SEQ_NO" ;
#            drop:neq "" ;
#         ] ;
#      ] ;
#      rr:predicateMap [
#         rr:constant org:hasRegisteredSite;
#         dr:condition [
#            rr:column "ADDRESS_SEQ_NO" ;
#            drop:neq "" ;
#         ]
#      ] ;
#      rr:objectMap [
#         rr:parentTriplesMap [
#            rr:subjectMap [
#               rr:template "{@sd-site-cy}{ORGANISATION_TYPE_CODE}{REGISTRATION_NO}";
#               rr:class org:Site ;
#            ] ;
               rr:predicateObjectMap [
                  rr:predicate  m8g:registeredAddress ;
                  rr:objectMap [
                     rr:template "{@sd-address-cy}{ADDRESS_SEQ_NO}";
                     rr:termType rr:IRI ;
                  ] ;   
#            ] ;
#         ] ;
#      ] ;
      ] ;
   ] .
   
<#RegisteredOfficeMapping>  
# ++ ADDRESS_SEQ_NO
# ++ STREET
# ++ BUILDING
# ++ TERRITORY

   rr:logicalTable [ 
      a dr:CSVTable;
      dr:source <#RegisteredOfficeSource> ;
	  dr:headerRecord true;
	  dr:delimiter ",";
	  dr:quoteCharacter "\"";
#      dr:offset 173000 ;
#	  dr:limit  20;
   ] ;
   
   dr:definedColumns ( 
   [ 
      dr:name "STREET_SPLIT" ;
      dr:function drop:extractMatch ; 
      dr:parameterBinding [ 
	     dr:parameter "input" ;
         rr:column "STREET"  ;
      ] ;
      dr:parameterBinding [
	     dr:parameter "regex" ;
         rr:constant "^(.*?), (?:([0-9]+.*), )?$"  ;
      ] ; 
   ] 
#   [
#      dr:name "TERRITORY_NORMALIZED" ; # _ -> ,
#      dr:function drop:replace ; 
#      dr:parameterBinding [ 
#	     dr:parameter "input" ;
#         rr:column "TERRITORY"  ;
#      ] ;
#      dr:parameterBinding [
#	     dr:parameter "regex" ;
#         rr:constant "_ "  ;
#      ] ; 
#      dr:parameterBinding [
#	     dr:parameter "replacement" ;
#         rr:constant ", "  ;
#      ] ;
#   ]  
   [
      dr:name "TERRITORY_SPLIT_A" ; # TERRITORY_SPLIT_A.match#2 -> COUNTRY
      dr:function drop:extractMatch ; 
      dr:parameterBinding [ 
	     dr:parameter "input" ;
         rr:column "TERRITORY"  ;
      ] ;
      dr:parameterBinding [
	     dr:parameter "regex" ;
         rr:constant "^(?:(.*), )?(.*?)$"  ;
      ] ; 
   ] [
      dr:name "TERRITORY_SPLIT_B" ; # TERRITORY_SPLIT_B.match#2 -> PREFECTURE
      dr:function drop:extractMatch ; 
      dr:parameterBinding [ 
	     dr:parameter "input" ;
         rr:column "TERRITORY_SPLIT_A.match#1"  ;
      ] ;
      dr:parameterBinding [
	     dr:parameter "regex" ;
         rr:constant "^(?:(.*), )?([^0-9]*?)$"  ;
      ] ; 
   ] [
      dr:name "TERRITORY_SPLIT_C" ; # TERRITORY_SPLIT_C.match#2 -> POSTCODE
      dr:function drop:extractMatch ; 
      dr:parameterBinding [ 
	     dr:parameter "input" ;
         rr:column "TERRITORY_SPLIT_B.match#1"  ;
      ] ;
      dr:parameterBinding [
	     dr:parameter "regex" ;
         rr:constant "^([^0-9]+)?([0-9]{4})?$"  ;
      ] ; 
   ] [
      dr:name "TERRITORY_SPLIT_D" ; # TERRITORY_SPLIT_D -> POSTNAME
      dr:function drop:replace ; 
      dr:parameterBinding [ 
	     dr:parameter "input" ;
         rr:column "TERRITORY_SPLIT_C.match#1"  ;
      ] ;
      dr:parameterBinding [
	     dr:parameter "regex" ;
         rr:constant ",\\s*$"  ;
      ] ; 
      dr:parameterBinding [
	     dr:parameter "replacement" ;
         rr:constant ""  ;
      ] ; 
   ]  
   ) ;
   
   dr:transformations ( [
      dr:dataref <#CountryTransformation> ;
      dr:transformationName "CountryTransformation";
      dr:parameterBinding [ 
         dr:parameter "TEXT" ;
         rr:column "TERRITORY_SPLIT_A.match#2" ;
      ]  ;
   ] [
      dr:dataref <#PostCodeTransformation> ;
      dr:transformationName "PostCodeTransformation";
      dr:parameterBinding [ 
         dr:parameter "COUNTRY" ;
         rr:column "CountryTransformation~~$.alpha2[0]" ;
      ] ;
      dr:parameterBinding [ 
         dr:parameter "POSTCODE" ;
         rr:column "TERRITORY_SPLIT_C.match#2" ;
         dr:condition [
            rr:column "TERRITORY_SPLIT_C.match#2" ;
            drop:neq "";
         ] ; 		 
      ]  ;
#   ] [
#      dr:dataref <#RegionTransformation> ;
#      dr:transformationName "RegionTransformation";
#      dr:parameterBinding [ 
#         dr:parameter "TEXT" ;
#         rr:column "TERRITORY_SPLIT_D" ;
#         dr:condition [
#            rr:column "TERRITORY_SPLIT_C.match#2" ;
#            drop:eq "";
#			dr:booleanOperator drop:and ;
#			dr:operand [
#			   rr:column "TERRITORY_SPLIT_D" ;
#			   drop:neq "";
#			]
#         ] ; 		 
#      ]  ;
   ] );
   
   dr:triplesMap [
      # ID - CLASS
      rr:subjectMap [ 
         rr:template  "{@sd-address-cy}{ADDRESS_SEQ_NO}" ;
         rr:class locn:Address ;
      ] ;   
   
      rr:predicateObjectMap [ 
         rr:predicate  locn:thoroughfare ;
         rr:objectMap  [ 
           rr:column "STREET_SPLIT.match#1" ;
           rr:termType  rr:Literal ;
            dr:condition [
               rr:column "CountryTransformation~~$.alpha2[0]" ;
               drop:eq "CY";
            ] ;  
         ] ;      
      ] ;   
   
      rr:predicateObjectMap [ 
         rr:predicate  locn:locatorDesignator ;
         rr:objectMap  [ 
            rr:column "STREET_SPLIT.match#2" ;
            rr:termType  rr:Literal ;
            dr:condition [
               rr:column "CountryTransformation~~$.alpha2[0]" ;
               drop:eq "CY";
            ] ;  
         ] ;      
      ] ; 

      rr:predicateObjectMap [ 
         rr:predicate  locn:postName ;
         rr:objectMap  [ 
            rr:column "TERRITORY_SPLIT_D" ;
            rr:termType  rr:Literal ;
            dr:condition [
               rr:column "CountryTransformation~~$.alpha2[0]" ;
               drop:eq "CY";
            ] ;  
         ] ;      
      ] ; 
   
      rr:predicateObjectMap [ 
         rr:predicate  locn:postCode ;
         rr:objectMap  [ 
            rr:column "TERRITORY_SPLIT_C.match#2" ;
            rr:termType  rr:Literal ;
            dr:condition [
               rr:column "CountryTransformation~~$.alpha2[0]" ;
               drop:eq "CY";
            ] ;  
         ] ;      
      ] ; 
   
      rr:predicateObjectMap [ 
         rr:predicate  locn:adminUnitL1 ;
         rr:objectMap  [ 
            rr:column "CountryTransformation~~$.alpha2[0]" ;
            rr:termType  rr:Literal ;
         ] ;      
      ] ;

      rr:predicateObjectMap [ 
         rr:predicate  locn:adminUnitL2 ;
         rr:objectMap  [ 
            rr:column "TERRITORY_SPLIT_B.match#2" ;
            rr:termType  rr:Literal ;
            dr:condition [
               rr:column "CountryTransformation~~$.alpha2[0]" ;
               drop:eq "CY";
            ] ;                        
         ] ;      
      ] ;
   
      rr:predicateObjectMap [ 
         rr:predicate  locn:fullAddress ;
         rr:objectMap  [ 
            rr:template "<<{BUILDING}>><<{STREET}>>{TERRITORY}" ;
            rr:termType  rr:Literal ;
         ] ;      
      ] ;    
   
      rr:predicateObjectMap [ 
         rr:predicate  m8g:adminUnit ;
         rr:objectMap  [ 
            rr:column "CountryTransformation~~$.nal[0]" ;
            rr:termType  rr:IRI ;
         ] ;    
      ] ;

      rr:predicateObjectMap [ 
         rr:predicate  m8g:adminUnit ;
         rr:objectMap  [ 
            rr:template "{@nuts-item}{PostCodeTransformation~~$.NUTS3}" ;
            rr:termType  rr:IRI ;
            dr:condition [
               rr:column "CountryTransformation~~$.alpha2[0]" ;
               drop:eq "CY";
            ] ;                        
         ] ;
      ] ;

#      rr:predicateObjectMap [ 
#         rr:predicate  m8g:adminUnit ;
#         rr:objectMap  [ 
#            rr:column "RegionTransformation~~$.r1-uri[0]" ;
#            rr:termType  rr:IRI ;
#            dr:condition [
#               rr:column "CountryTransformation~~$.alpha2[0]" ;
#               drop:eq "CY";
#            ] ;                        
#         ] ;      
#      ] ; 

      rr:predicateObjectMap [ 
         rr:predicate  m8g:adminUnit ;
         rr:objectMap  [ 
            rr:template "{@lau-item}{PostCodeTransformation~~$.LAU}" ;
            rr:termType  rr:IRI ;
            dr:condition [
               rr:column "CountryTransformation~~$.alpha2[0]" ;
               drop:eq "CY";
            ] ;                        
         ]
      ] ;

#      rr:predicateObjectMap [ 
#         rr:predicate  m8g:adminUnit ;
#         rr:objectMap  [ 
#            rr:column "RegionTransformation~~$.uri" ;
#            rr:termType  rr:IRI ;
#            dr:condition [
#               rr:column "CountryTransformation~~$.alpha2[0]" ;
#               drop:eq "CY";
#            ] ;                        
#         ] ;      
#      ] ;   
   ];
   
   dr:triplesMap [
      dr:logicalOutput <#AdminLevelModel> ;
      rr:subjectMap [ 
         rr:column "CountryTransformation~~$.nal[0]" ;
         rr:class sd-voc-adminlevel:Country ;
      ] ;
   ] ;
   
   dr:triplesMap [
      dr:logicalOutput <#AdminLevelModel> ;
      rr:subjectMap [ 
         rr:template "{@nuts-item}{PostCodeTransformation~~$.NUTS3}";
         rr:class sd-voc-adminlevel:NUTS-3 ;
      ] ;
   ] ;
   
   dr:triplesMap [
      dr:logicalOutput <#AdminLevelModel> ;
      rr:subjectMap [ 
         rr:template "{@lau-item}{PostCodeTransformation~~$.LAU}" ;
         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 ;
         ]
      ] ;   
   ] .
