diff --git a/src/main/engine/net/sf/jailer/datamodel/DataModel.java b/src/main/engine/net/sf/jailer/datamodel/DataModel.java
index 198aa1bd0..c5789d87c 100644
--- a/src/main/engine/net/sf/jailer/datamodel/DataModel.java
+++ b/src/main/engine/net/sf/jailer/datamodel/DataModel.java
@@ -37,11 +37,13 @@
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
+import java.util.Optional;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeMap;
import java.util.TreeSet;
+import org.apache.commons.collections4.MapUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -304,6 +306,18 @@ public Collection
getTables() {
return tables.values();
}
+ /**
+ * When starting UI we need to pick a table to get selected at first, in a stable way.
+ * Alphabetically first table sounds good and deterministic.
+ */
+ public Optional firstTable() {
+ if (MapUtils.isEmpty(tables)) {
+ return Optional.empty();
+ }
+
+ return tables.keySet().stream().sorted().findFirst().map(tables::get);
+ }
+
/**
* Reads in table.csv and association.csv
* and builds the relational data model.
diff --git a/src/main/engine/net/sf/jailer/extractionmodel/ExtractionModel.java b/src/main/engine/net/sf/jailer/extractionmodel/ExtractionModel.java
index c3173ccec..1134e748e 100644
--- a/src/main/engine/net/sf/jailer/extractionmodel/ExtractionModel.java
+++ b/src/main/engine/net/sf/jailer/extractionmodel/ExtractionModel.java
@@ -198,7 +198,7 @@ public boolean equals(Object obj) {
public ExtractionModel(DataModel dataModel, ExecutionContext executionContext) {
this.dataModel = dataModel;
this.version = null;
- subject = dataModel.getTables().iterator().hasNext()? dataModel.getTables().iterator().next() : null;
+ subject = dataModel.firstTable().orElse(null);
condition = "";
dataModel.setRestrictionModel(new RestrictionModel(dataModel, executionContext));
dataModel.deriveFilters();