diff --git a/pom.xml b/pom.xml
index 1587d56..441dc78 100644
--- a/pom.xml
+++ b/pom.xml
@@ -27,6 +27,7 @@
5.13.2
2.0.17
4.5.0
+ 0.6.2
3.14.0
3.8.1
3.3.1
@@ -231,6 +232,13 @@
${tableschema-java-version}
+
+
+ com.google.code.externalsortinginjava
+ externalsortinginjava
+ ${externalsortinginjava.version}
+
+
org.junit.jupiter
diff --git a/src/main/java/io/frictionlessdata/datapackage/resource/AbstractResource.java b/src/main/java/io/frictionlessdata/datapackage/resource/AbstractResource.java
index dd53e73..4d0e51c 100644
--- a/src/main/java/io/frictionlessdata/datapackage/resource/AbstractResource.java
+++ b/src/main/java/io/frictionlessdata/datapackage/resource/AbstractResource.java
@@ -6,6 +6,7 @@
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.code.externalsorting.ExternalSort;
import io.frictionlessdata.datapackage.Dialect;
import io.frictionlessdata.datapackage.JSONBase;
import io.frictionlessdata.datapackage.Package;
@@ -14,10 +15,7 @@
import io.frictionlessdata.datapackage.exceptions.DataPackageValidationException;
import io.frictionlessdata.datapackage.fk.PackageForeignKey;
import io.frictionlessdata.tableschema.Table;
-import io.frictionlessdata.tableschema.exception.ForeignKeyException;
-import io.frictionlessdata.tableschema.exception.JsonSerializingException;
-import io.frictionlessdata.tableschema.exception.TableIOException;
-import io.frictionlessdata.tableschema.exception.TypeInferringException;
+import io.frictionlessdata.tableschema.exception.*;
import io.frictionlessdata.tableschema.field.Field;
import io.frictionlessdata.tableschema.fk.ForeignKey;
import io.frictionlessdata.tableschema.io.FileReference;
@@ -40,6 +38,7 @@
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.*;
+import java.util.stream.Collectors;
/**
* Abstract base implementation of a Resource.
@@ -368,6 +367,7 @@ public List getTables() throws Exception {
return tables;
}
+ @Override
public void checkRelations(Package pkg) {
if (null != schema) {
List fks = new ArrayList<>();
@@ -439,6 +439,71 @@ public void checkRelations(Package pkg) {
}
}
+ @Override
+ public void checkPrimaryKeys() {
+ if (null != schema) {
+ Object pkObj = schema.getPrimaryKey();
+ if (pkObj == null) {
+ return; // no primary key defined
+ }
+
+ // Normalize PK fields
+ String[] pkFields;
+ if (pkObj instanceof String) {
+ pkFields = new String[]{(String) pkObj};
+ } else if (pkObj instanceof String[]) {
+ pkFields = (String[]) pkObj;
+ } else {
+ throw new PrimaryKeyException("Unsupported primary key type: " + pkObj.getClass());
+ }
+
+ try {
+ // Dump all keys to a temporary file
+ Path tempFile = Files.createTempFile("pk-check", ".txt");
+ try (BufferedWriter writer = Files.newBufferedWriter(tempFile)) {
+ List