Skip to content

Commit b55bbbf

Browse files
committed
Add skos lookup (#415)
Works like fix function 'lookup', also using a Map. The Map is build dynamically querying an RDF model.
1 parent 0390880 commit b55bbbf

File tree

7 files changed

+478
-0
lines changed

7 files changed

+478
-0
lines changed

README.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -606,6 +606,16 @@ lookup("path.to.field", "map-name", __default: "NA")
606606
lookup("path.to.field", "map-name", print_unknown: "true", destination: "unknown.txt")
607607
```
608608

609+
##### `lookup_rdf`
610+
611+
Looks up matching values in an RDF resource and replaces the field value with this match. A file as well as an HTTP(S) resource can be used.
612+
613+
```perl
614+
lookup_rdf("<sourceField>", "<rdfResource>", target: "<RDF Property>")
615+
lookup_rdf("<sourceField>", "<rdfResource>", target: "<RDF Property>", target_language: "<RDF language tag>")
616+
lookup_rdf("<sourceField>", "<rdfResource>", target: "<RDF Property>", __default: "NA")
617+
```
618+
609619
##### `prepend`
610620

611621
Adds a string at the beginning of a field value.

build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ subprojects {
3838
'equalsverifier': '3.8.2',
3939
'jackson': '2.13.3',
4040
'jetty': '9.4.14.v20181114',
41+
'jena': '3.17.0',
4142
'jquery': '3.3.1-1',
4243
'junit_jupiter': '5.8.2',
4344
'junit_platform': '1.4.2',

metafix/build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,12 @@ dependencies {
1313
implementation "com.fasterxml.jackson.core:jackson-core:${versions.jackson}"
1414
implementation "com.fasterxml.jackson.core:jackson-databind:${versions.jackson}"
1515
implementation "com.google.guava:guava:${versions.guava}"
16+
implementation "org.apache.jena:jena-core:${versions.jena}"
17+
implementation "org.apache.jena:jena-arq:${versions.jena}"
1618
implementation "org.eclipse.emf:org.eclipse.emf.ecore:${versions.xtext}" // Workaround for hbz/lobid-resources#1462
1719
implementation "org.eclipse.xtext:org.eclipse.xtext.xbase:${versions.xtext}"
1820
implementation "org.eclipse.xtext:org.eclipse.xtext:${versions.xtext}"
21+
implementation "org.eclipse.xtext:org.eclipse.xtext.xbase:${versions.xtext}"
1922
implementation "org.slf4j:slf4j-api:${versions.slf4j}"
2023

2124
testImplementation "org.junit.jupiter:junit-jupiter-api:${versions.junit_jupiter}"

metafix/src/main/java/org/metafacture/metafix/FixMethod.java

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.metafacture.metafix;
1818

1919
import org.metafacture.metafix.api.FixFunction;
20+
import org.metafacture.metafix.maps.RdfMap;
2021
import org.metafacture.metamorph.api.Maps;
2122
import org.metafacture.metamorph.functions.ISBN;
2223
import org.metafacture.metamorph.functions.Timestamp;
@@ -92,6 +93,24 @@ public void apply(final Metafix metafix, final Record record, final List<String>
9293
metafix.putMap(params.get(0), options);
9394
}
9495
},
96+
put_rdfmap {
97+
@Override
98+
public void apply(final Metafix metafix, final Record record, final List<String> params, final Map<String, String> options) {
99+
final String fileName = params.get(0);
100+
final RdfMap rdf = new RdfMap();
101+
rdf.setFile(metafix.resolvePath(fileName));
102+
if (options.containsKey("target_language")) {
103+
rdf.setTargetLanguage(options.get("target_language"));
104+
}
105+
if (options.containsKey("target")) {
106+
rdf.setTarget(options.get("target"));
107+
}
108+
if (options.containsKey(Maps.DEFAULT_MAP_KEY)) {
109+
rdf.setDefault(options.get(Maps.DEFAULT_MAP_KEY));
110+
}
111+
metafix.putMap(params.size() > 1 ? params.get(1) : fileName, rdf);
112+
}
113+
},
95114
put_var {
96115
@Override
97116
public void apply(final Metafix metafix, final Record record, final List<String> params, final Map<String, String> options) {
@@ -470,6 +489,7 @@ public void apply(final Metafix metafix, final Record record, final List<String>
470489

471490
@Override
472491
public void apply(final Metafix metafix, final Record record, final List<String> params, final Map<String, String> options) {
492+
<<<<<<< HEAD
473493
final Map<String, String> map;
474494

475495
if (params.size() <= 1) {
@@ -517,6 +537,16 @@ public void apply(final Metafix metafix, final Record record, final List<String>
517537
}
518538
}
519539
},
540+
lookup_rdf {
541+
@Override
542+
public void apply(final Metafix metafix, final Record record, final List<String> params, final Map<String, String> options) {
543+
final Map<String, String> map = extracted(metafix, record, params, options, KIND_OF_RDFMAP);
544+
record.transform(params.get(0), oldValue -> {
545+
final String newValue = map.get(oldValue);
546+
return newValue != null ? newValue : getBoolean(options, "delete") ? null : oldValue;
547+
});
548+
}
549+
},
520550
prepend {
521551
@Override
522552
public void apply(final Metafix metafix, final Record record, final List<String> params, final Map<String, String> options) {
@@ -639,6 +669,8 @@ public void apply(final Metafix metafix, final Record record, final List<String>
639669
}
640670
};
641671

672+
public static final String KIND_OF_RDFMAP = "rdfmap";
673+
public static final String KIND_OF_FILEMAP = "filemap";
642674
private static final Pattern NAMED_GROUP_PATTERN = Pattern.compile("\\(\\?<(.+?)>");
643675

644676
private static final String FILEMAP_SEPARATOR_OPTION = "sep_char";
@@ -647,5 +679,33 @@ public void apply(final Metafix metafix, final Record record, final List<String>
647679
private static final String ERROR_STRING_OPTION = "error_string";
648680

649681
private static final Random RANDOM = new Random();
682+
private static String defaultValue;
683+
684+
private static Map<String, String> extracted(final Metafix metafix, final Record record, final List<String> params, final Map<String, String> options, final String kindOfMap) {
685+
final Map<String, String> map;
686+
if (params.size() <= 1) {
687+
map = options;
688+
}
689+
else {
690+
final String mapName = params.get(1);
691+
692+
if (!metafix.getMapNames().contains(mapName)) {
693+
if (mapName.contains(".") || mapName.contains(File.separator)) {
694+
if (kindOfMap.equals(KIND_OF_FILEMAP)) {
695+
put_filemap.apply(metafix, record, Arrays.asList(mapName), options);
696+
}
697+
if (kindOfMap.equals(KIND_OF_RDFMAP)) {
698+
put_rdfmap.apply(metafix, record, Arrays.asList(mapName), options);
699+
}
700+
}
701+
else {
702+
// Probably an unknown internal map? Log a warning?
703+
}
704+
}
705+
map = metafix.getMap(mapName);
706+
}
707+
defaultValue = map.get(Maps.DEFAULT_MAP_KEY); // TODO: Catmandu uses 'default'
708+
return map;
709+
}
650710

651711
}

0 commit comments

Comments
 (0)