You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@baremaps.apache.org by bc...@apache.org on 2023/02/26 19:56:48 UTC

[incubator-baremaps] 01/01: Improve naming and documentation

This is an automated email from the ASF dual-hosted git repository.

bchapuis pushed a commit to branch 590-flatgeobuf
in repository https://gitbox.apache.org/repos/asf/incubator-baremaps.git

commit b8d50269abb901294e37e120e0dccc4dbeea60dd
Author: Bertil Chapuis <bc...@gmail.com>
AuthorDate: Sun Feb 26 20:47:34 2023 +0100

    Improve naming and documentation
---
 .../baremaps/dataframe/AbstractDataFrame.java      |   3 +
 .../java/org/apache/baremaps/dataframe/Column.java |  13 ++
 .../org/apache/baremaps/dataframe/ColumnImpl.java  |   3 +
 .../org/apache/baremaps/dataframe/DataFrame.java   |  10 +-
 .../apache/baremaps/dataframe/DataFrameImpl.java   |  22 +++-
 .../org/apache/baremaps/dataframe/DataStore.java   |  28 ++++-
 .../java/org/apache/baremaps/dataframe/Row.java    |  39 ++++--
 .../org/apache/baremaps/dataframe/RowImpl.java     |  23 ++--
 .../dataframe/{DataType.java => Schema.java}       |  22 +++-
 .../{DataTypeImpl.java => SchemaImpl.java}         |  16 ++-
 ...form.java => DataFrameGeometryTransformer.java} |  29 +++--
 ...BufFeatureSet.java => FlatGeoBufDataFrame.java} |  24 ++--
 .../storage/flatgeobuf/RowConversions.java         |   6 +-
 .../{FeatureIterator.java => RowIterator.java}     |  12 +-
 .../storage/geopackage/GeoPackageDatabase.java     |  12 +-
 .../storage/geopackage/GeoPackageTable.java        |  20 +--
 .../storage/postgres/PostgresDataFrame.java        |  12 +-
 .../storage/postgres/PostgresDatabase.java         | 140 ++++++++++-----------
 .../storage/shapefile/ShapefileDataFrame.java      |  13 +-
 .../storage/shapefile/ShapefileDirectory.java      |  10 +-
 .../shapefile/internal/InputFeatureStream.java     |  45 +++----
 .../shapefile/internal/ShapefileByteReader.java    |  24 ++--
 .../shapefile/internal/ShapefileReader.java        |  14 +--
 .../org/apache/baremaps/workflow/tasks/Entity.java |  16 +--
 .../baremaps/workflow/tasks/ImportGeoPackage.java  |   4 +-
 .../baremaps/workflow/tasks/ImportShapefile.java   |   4 +-
 .../workflow/tasks/TransformEntityCollection.java  |   4 +-
 .../org/apache/baremaps/mvt/ExpressionsTest.java   |  12 +-
 ...reSetTest.java => FlatGeoBufDataFrameTest.java} |  14 +--
 29 files changed, 346 insertions(+), 248 deletions(-)

diff --git a/baremaps-core/src/main/java/org/apache/baremaps/dataframe/AbstractDataFrame.java b/baremaps-core/src/main/java/org/apache/baremaps/dataframe/AbstractDataFrame.java
index 8a0349a4..959238f4 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/dataframe/AbstractDataFrame.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/dataframe/AbstractDataFrame.java
@@ -14,6 +14,9 @@ package org.apache.baremaps.dataframe;
 
 import org.apache.baremaps.collection.AbstractDataCollection;
 
+/**
+ * A data frame is a collection of rows respecting a schema.
+ */
 public abstract class AbstractDataFrame extends AbstractDataCollection<Row> implements DataFrame {
 
 }
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/dataframe/Column.java b/baremaps-core/src/main/java/org/apache/baremaps/dataframe/Column.java
index 174d86ad..189dd730 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/dataframe/Column.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/dataframe/Column.java
@@ -12,10 +12,23 @@
 
 package org.apache.baremaps.dataframe;
 
+/**
+ * A column in a data frame.
+ */
 public interface Column {
 
+  /**
+   * Returns the name of the column.
+   *
+   * @return the name of the column
+   */
   String name();
 
+  /**
+   * Returns the type of the column.
+   *
+   * @return the type of the column
+   */
   Class type();
 
 }
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/dataframe/ColumnImpl.java b/baremaps-core/src/main/java/org/apache/baremaps/dataframe/ColumnImpl.java
index ad3928c7..79d3e59c 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/dataframe/ColumnImpl.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/dataframe/ColumnImpl.java
@@ -12,6 +12,9 @@
 
 package org.apache.baremaps.dataframe;
 
+/**
+ * A A column in a data frame.
+ */
 public record ColumnImpl(String name, Class type) implements Column {
 
 }
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/dataframe/DataFrame.java b/baremaps-core/src/main/java/org/apache/baremaps/dataframe/DataFrame.java
index 3efccf11..02f59176 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/dataframe/DataFrame.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/dataframe/DataFrame.java
@@ -14,8 +14,16 @@ package org.apache.baremaps.dataframe;
 
 import org.apache.baremaps.collection.DataCollection;
 
+/**
+ * A data frame is a collection of rows respecting a schema.
+ */
 public interface DataFrame extends DataCollection<Row> {
 
-  DataType dataType();
+  /**
+   * Returns the schema of the data frame.
+   *
+   * @return the schema of the data frame
+   */
+  Schema schema();
 
 }
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/dataframe/DataFrameImpl.java b/baremaps-core/src/main/java/org/apache/baremaps/dataframe/DataFrameImpl.java
index 4b0ffd27..a31e8267 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/dataframe/DataFrameImpl.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/dataframe/DataFrameImpl.java
@@ -14,21 +14,35 @@ package org.apache.baremaps.dataframe;
 
 import java.util.ArrayList;
 
+/**
+ * A data frame is a collection of rows respecting a schema.
+ */
 public class DataFrameImpl extends ArrayList<Row> implements DataFrame {
 
-  private final DataType dataType;
+  private final Schema dataType;
 
-  public DataFrameImpl(DataType dataType) {
-    this.dataType = dataType;
+  /**
+   * Constructs a data frame with the specified schema.
+   *
+   * @param schema the schema of the data frame
+   */
+  public DataFrameImpl(Schema schema) {
+    this.dataType = schema;
   }
 
+  /**
+   * {@inheritDoc}
+   */
   @Override
   public long sizeAsLong() {
     return size();
   }
 
+  /**
+   * {@inheritDoc}
+   */
   @Override
-  public DataType dataType() {
+  public Schema schema() {
     return dataType;
   }
 }
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/dataframe/DataStore.java b/baremaps-core/src/main/java/org/apache/baremaps/dataframe/DataStore.java
index ce89b957..451a563a 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/dataframe/DataStore.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/dataframe/DataStore.java
@@ -14,14 +14,38 @@ package org.apache.baremaps.dataframe;
 
 import java.util.Collection;
 
+/**
+ * A data store is a collection of data frames.
+ */
 public interface DataStore {
 
-  Collection<DataFrame> list() throws DataFrameException;
-
+  /**
+   * Lists the names of the data frames.
+   * 
+   * @return the names of the data frames
+   */
+  Collection<String> list() throws DataFrameException;
+
+  /**
+   * Gets a data frame by its name.
+   * 
+   * @param name the name of the data frame
+   * @return the data frame
+   */
   DataFrame get(String name) throws DataFrameException;
 
+  /**
+   * Adds a data frame to the data store.
+   * 
+   * @param value the data frame
+   */
   void add(DataFrame value) throws DataFrameException;
 
+  /**
+   * Removes a data frame from the data store.
+   * 
+   * @param name the name of the data frame
+   */
   void remove(String name) throws DataFrameException;
 
 }
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/dataframe/Row.java b/baremaps-core/src/main/java/org/apache/baremaps/dataframe/Row.java
index 8b291119..ac97fa76 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/dataframe/Row.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/dataframe/Row.java
@@ -14,14 +14,39 @@ package org.apache.baremaps.dataframe;
 
 import java.util.List;
 
+/**
+ * A row in a data frame.
+ */
 public interface Row {
 
-  DataType dataType();
-
-  List<Object> values();
-
-  Object get(String name);
-
-  void set(String name, Object value);
+  /**
+   * Returns the schema of the row.
+   * 
+   * @return the schema of the row
+   */
+  Schema dataType();
+
+  /**
+   * Returns the values of the columns in the row.
+   * 
+   * @return the values of the columns in the row
+   */
+  List values();
+
+  /**
+   * Returns the value of the specified column.
+   * 
+   * @param column the column
+   * @return the value of the specified column
+   */
+  Object get(String column);
+
+  /**
+   * Sets the value of the specified column.
+   * 
+   * @param column the column
+   * @param value the value
+   */
+  void set(String column, Object value);
 
 }
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/dataframe/RowImpl.java b/baremaps-core/src/main/java/org/apache/baremaps/dataframe/RowImpl.java
index 027b383e..3b7aa0e4 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/dataframe/RowImpl.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/dataframe/RowImpl.java
@@ -14,27 +14,36 @@ package org.apache.baremaps.dataframe;
 
 import java.util.List;
 
-public record RowImpl(DataType dataType, List values) implements Row {
+/**
+ * A row in a data frame.
+ */
+public record RowImpl(Schema dataType, List values) implements Row {
 
+  /**
+   * {@inheritDoc}
+   */
   @Override
-  public Object get(String name) {
+  public Object get(String column) {
     for (int i = 0; i < dataType().columns().size(); i++) {
-      if (dataType().columns().get(i).name().equals(name)) {
+      if (dataType().columns().get(i).name().equals(column)) {
         return values.get(i);
       }
     }
-    throw new IllegalArgumentException("Column " + name + " not found.");
+    throw new IllegalArgumentException("Column " + column + " not found.");
   }
 
+  /**
+   * {@inheritDoc}
+   */
   @Override
-  public void set(String name, Object value) {
+  public void set(String column, Object value) {
     for (int i = 0; i < dataType().columns().size(); i++) {
-      if (dataType().columns().get(i).name().equals(name)) {
+      if (dataType().columns().get(i).name().equals(column)) {
         values.set(i, value);
         return;
       }
     }
-    throw new IllegalArgumentException("Column " + name + " not found.");
+    throw new IllegalArgumentException("Column " + column + " not found.");
   }
 
 }
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/dataframe/DataType.java b/baremaps-core/src/main/java/org/apache/baremaps/dataframe/Schema.java
similarity index 63%
rename from baremaps-core/src/main/java/org/apache/baremaps/dataframe/DataType.java
rename to baremaps-core/src/main/java/org/apache/baremaps/dataframe/Schema.java
index 29352566..2c6fb2fd 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/dataframe/DataType.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/dataframe/Schema.java
@@ -14,12 +14,30 @@ package org.apache.baremaps.dataframe;
 
 import java.util.List;
 
-public interface DataType {
+/**
+ * A schema defines the structure of a data frame.
+ */
+public interface Schema {
 
+  /**
+   * Returns the name of the schema.
+   * 
+   * @return the name of the schema
+   */
   String name();
 
+  /**
+   * Returns the columns of the schema.
+   * 
+   * @return the columns of the schema
+   */
   List<Column> columns();
 
-  Row newInstance();
+  /**
+   * Creates a new row of the schema.
+   * 
+   * @return a new row of the schema
+   */
+  Row createRow();
 
 }
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/dataframe/DataTypeImpl.java b/baremaps-core/src/main/java/org/apache/baremaps/dataframe/SchemaImpl.java
similarity index 64%
rename from baremaps-core/src/main/java/org/apache/baremaps/dataframe/DataTypeImpl.java
rename to baremaps-core/src/main/java/org/apache/baremaps/dataframe/SchemaImpl.java
index ee362fd2..ac13b179 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/dataframe/DataTypeImpl.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/dataframe/SchemaImpl.java
@@ -15,10 +15,20 @@ package org.apache.baremaps.dataframe;
 import java.util.ArrayList;
 import java.util.List;
 
-public record DataTypeImpl(String name, List<Column> columns) implements DataType {
+/**
+ * A schema defines the structure of a data frame.
+ */
+public record SchemaImpl(String name, List<Column> columns) implements Schema {
 
+  /**
+   * {@inheritDoc}
+   */
   @Override
-  public Row newInstance() {
-    return new RowImpl(this, new ArrayList(columns.size()));
+  public Row createRow() {
+    var values = new ArrayList<>(columns.size());
+    for (int i = 0; i < columns.size(); i++) {
+      values.add(null);
+    }
+    return new RowImpl(this, values);
   }
 }
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/storage/DataFrameProjectionTransform.java b/baremaps-core/src/main/java/org/apache/baremaps/storage/DataFrameGeometryTransformer.java
similarity index 64%
rename from baremaps-core/src/main/java/org/apache/baremaps/storage/DataFrameProjectionTransform.java
rename to baremaps-core/src/main/java/org/apache/baremaps/storage/DataFrameGeometryTransformer.java
index 9074d45e..75330537 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/storage/DataFrameProjectionTransform.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/storage/DataFrameGeometryTransformer.java
@@ -13,51 +13,50 @@
 package org.apache.baremaps.storage;
 
 
-
 import java.util.Iterator;
 import org.apache.baremaps.collection.AbstractDataCollection;
 import org.apache.baremaps.dataframe.Column;
 import org.apache.baremaps.dataframe.DataFrame;
-import org.apache.baremaps.dataframe.DataType;
 import org.apache.baremaps.dataframe.Row;
-import org.apache.baremaps.openstreetmap.utils.ProjectionTransformer;
+import org.apache.baremaps.dataframe.Schema;
 import org.locationtech.jts.geom.Geometry;
+import org.locationtech.jts.geom.util.GeometryTransformer;
 
-public class DataFrameProjectionTransform extends AbstractDataCollection<Row> implements DataFrame {
+public class DataFrameGeometryTransformer extends AbstractDataCollection<Row> implements DataFrame {
 
   private final DataFrame dataFrame;
 
-  private final ProjectionTransformer projectionTransformer;
+  private final GeometryTransformer transformer;
 
-  public DataFrameProjectionTransform(DataFrame dataFrame,
-      ProjectionTransformer projectionTransformer) {
+  public DataFrameGeometryTransformer(DataFrame dataFrame,
+      GeometryTransformer geometryTransformer) {
     this.dataFrame = dataFrame;
-    this.projectionTransformer = projectionTransformer;
+    this.transformer = geometryTransformer;
   }
 
   @Override
-  public DataType dataType() {
-    return dataFrame.dataType();
+  public Schema schema() {
+    return dataFrame.schema();
   }
 
-  public Row transformProjection(Row row) {
-    var columns = dataType().columns().stream()
+  public Row transform(Row row) {
+    var columns = schema().columns().stream()
         .filter(column -> column.type().isInstance(Geometry.class)).toList();
     for (Column column : columns) {
       var name = column.name();
       var geometry = (Geometry) row.get(name);
-      row.set(name, projectionTransformer.transform(geometry));
+      row.set(name, transformer.transform(geometry));
     }
     return row;
   }
 
   @Override
   public Iterator<Row> iterator() {
-    return dataFrame.stream().map(this::transformProjection).iterator();
+    return dataFrame.stream().map(this::transform).iterator();
   }
 
   @Override
   public long sizeAsLong() {
-    return 0;
+    return dataFrame.sizeAsLong();
   }
 }
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/storage/flatgeobuf/FlatGeoBufFeatureSet.java b/baremaps-core/src/main/java/org/apache/baremaps/storage/flatgeobuf/FlatGeoBufDataFrame.java
similarity index 88%
rename from baremaps-core/src/main/java/org/apache/baremaps/storage/flatgeobuf/FlatGeoBufFeatureSet.java
rename to baremaps-core/src/main/java/org/apache/baremaps/storage/flatgeobuf/FlatGeoBufDataFrame.java
index 6d22a890..f0d2788f 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/storage/flatgeobuf/FlatGeoBufFeatureSet.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/storage/flatgeobuf/FlatGeoBufDataFrame.java
@@ -21,8 +21,8 @@ import java.nio.channels.SeekableByteChannel;
 import java.util.Collection;
 import java.util.Iterator;
 import org.apache.baremaps.collection.AbstractDataCollection;
-import org.apache.baremaps.dataframe.DataType;
 import org.apache.baremaps.dataframe.Row;
+import org.apache.baremaps.dataframe.Schema;
 import org.locationtech.jts.geom.Geometry;
 import org.wololo.flatgeobuf.Constants;
 import org.wololo.flatgeobuf.GeometryConversions;
@@ -30,26 +30,26 @@ import org.wololo.flatgeobuf.HeaderMeta;
 import org.wololo.flatgeobuf.PackedRTree;
 import org.wololo.flatgeobuf.generated.GeometryType;
 
-public class FlatGeoBufFeatureSet {
+public class FlatGeoBufDataFrame {
 
   private final SeekableByteChannel channel;
 
   private HeaderMeta headerMeta;
 
-  private DataType dataType;
+  private Schema schema;
 
-  public FlatGeoBufFeatureSet(SeekableByteChannel channel) {
+  public FlatGeoBufDataFrame(SeekableByteChannel channel) {
     this.channel = channel;
   }
 
-  public FlatGeoBufFeatureSet(SeekableByteChannel channel, DataType dataType) {
+  public FlatGeoBufDataFrame(SeekableByteChannel channel, Schema schema) {
     this.channel = channel;
-    this.dataType = dataType;
+    this.schema = schema;
   }
 
-  public DataType getType() throws IOException {
+  public Schema getSchema() throws IOException {
     readHeaderMeta();
-    return dataType;
+    return schema;
   }
 
   public Collection<Row> read() throws IOException {
@@ -68,7 +68,7 @@ public class FlatGeoBufFeatureSet {
           channel.position(headerMeta.offset + indexSize);
 
           // create the feature stream
-          return new FeatureIterator(channel, headerMeta, dataType);
+          return new RowIterator(channel, headerMeta, schema);
         } catch (IOException e) {
           throw new RuntimeException(e);
         }
@@ -88,7 +88,7 @@ public class FlatGeoBufFeatureSet {
     channel.read(headerMetaBuffer);
     headerMetaBuffer.flip();
     headerMeta = HeaderMeta.read(headerMetaBuffer);
-    dataType = RowConversions.asFeatureType(headerMeta);
+    schema = RowConversions.asFeatureType(headerMeta);
   }
 
   public void write(Collection<Row> features) throws IOException {
@@ -105,8 +105,8 @@ public class FlatGeoBufFeatureSet {
     headerMeta.indexNodeSize = 16;
     headerMeta.featuresCount =
         features instanceof AbstractDataCollection<Row>c ? c.sizeAsLong() : features.size();
-    headerMeta.name = dataType.name();
-    headerMeta.columns = RowConversions.asColumns(dataType.columns());
+    headerMeta.name = schema.name();
+    headerMeta.columns = RowConversions.asColumns(schema.columns());
 
     HeaderMeta.write(headerMeta, outputStream, bufferBuilder);
 
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/storage/flatgeobuf/RowConversions.java b/baremaps-core/src/main/java/org/apache/baremaps/storage/flatgeobuf/RowConversions.java
index 53d08391..84c940d7 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/storage/flatgeobuf/RowConversions.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/storage/flatgeobuf/RowConversions.java
@@ -33,16 +33,16 @@ import org.wololo.flatgeobuf.generated.Header;
 
 public class RowConversions {
 
-  public static DataType asFeatureType(HeaderMeta headerMeta) {
+  public static Schema asFeatureType(HeaderMeta headerMeta) {
     var name = headerMeta.name;
     var columns = headerMeta.columns.stream()
         .map(column -> new ColumnImpl(column.name, column.getBinding()))
         .map(Column.class::cast)
         .toList();
-    return new DataTypeImpl(name, columns);
+    return new SchemaImpl(name, columns);
   }
 
-  public static RowImpl asFeature(HeaderMeta headerMeta, DataType dataType, Feature feature) {
+  public static Row asRow(HeaderMeta headerMeta, Schema dataType, Feature feature) {
     var values = new ArrayList();
 
     var geometryBuffer = feature.geometry();
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/storage/flatgeobuf/FeatureIterator.java b/baremaps-core/src/main/java/org/apache/baremaps/storage/flatgeobuf/RowIterator.java
similarity index 83%
rename from baremaps-core/src/main/java/org/apache/baremaps/storage/flatgeobuf/FeatureIterator.java
rename to baremaps-core/src/main/java/org/apache/baremaps/storage/flatgeobuf/RowIterator.java
index cb1dab60..f1b611ad 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/storage/flatgeobuf/FeatureIterator.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/storage/flatgeobuf/RowIterator.java
@@ -18,16 +18,16 @@ import java.nio.ByteOrder;
 import java.nio.channels.SeekableByteChannel;
 import java.util.Iterator;
 import java.util.NoSuchElementException;
-import org.apache.baremaps.dataframe.DataType;
 import org.apache.baremaps.dataframe.Row;
+import org.apache.baremaps.dataframe.Schema;
 import org.wololo.flatgeobuf.HeaderMeta;
 import org.wololo.flatgeobuf.generated.Feature;
 
-public class FeatureIterator implements Iterator<Row> {
+public class RowIterator implements Iterator<Row> {
 
   private final HeaderMeta headerMeta;
 
-  private final DataType dataType;
+  private final Schema dataType;
 
   private final SeekableByteChannel channel;
 
@@ -35,8 +35,8 @@ public class FeatureIterator implements Iterator<Row> {
 
   private long cursor = 0;
 
-  public FeatureIterator(SeekableByteChannel channel, HeaderMeta headerMeta,
-      DataType dataType) {
+  public RowIterator(SeekableByteChannel channel, HeaderMeta headerMeta,
+      Schema dataType) {
     this.channel = channel;
     this.headerMeta = headerMeta;
     this.dataType = dataType;
@@ -56,7 +56,7 @@ public class FeatureIterator implements Iterator<Row> {
 
       var featureSize = buffer.getInt();
       var row =
-          RowConversions.asFeature(headerMeta, dataType, Feature.getRootAsFeature(buffer));
+          RowConversions.asRow(headerMeta, dataType, Feature.getRootAsFeature(buffer));
 
       buffer.position(Integer.BYTES + featureSize);
       buffer.compact();
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/storage/geopackage/GeoPackageDatabase.java b/baremaps-core/src/main/java/org/apache/baremaps/storage/geopackage/GeoPackageDatabase.java
index 1b05afe5..8c2008c2 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/storage/geopackage/GeoPackageDatabase.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/storage/geopackage/GeoPackageDatabase.java
@@ -36,19 +36,13 @@ public class GeoPackageDatabase implements DataStore, AutoCloseable {
   }
 
   @Override
-  public Collection<DataFrame> list() throws DataFrameException {
-    return geoPackage.getFeatureTables().stream()
-        .map(table -> new GeoPackageTable(geoPackage.getFeatureDao(table)))
-        .map(DataFrame.class::cast)
-        .toList();
+  public Collection<String> list() throws DataFrameException {
+    return geoPackage.getFeatureTables();
   }
 
   @Override
   public DataFrame get(String name) throws DataFrameException {
-    return list().stream()
-        .filter(dataFrame -> dataFrame.dataType().name().equals(name))
-        .findFirst()
-        .orElseThrow(() -> new DataFrameException());
+    return new GeoPackageTable(geoPackage.getFeatureDao(name));
   }
 
   @Override
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/storage/geopackage/GeoPackageTable.java b/baremaps-core/src/main/java/org/apache/baremaps/storage/geopackage/GeoPackageTable.java
index b406f29c..c992858e 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/storage/geopackage/GeoPackageTable.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/storage/geopackage/GeoPackageTable.java
@@ -26,7 +26,7 @@ public class GeoPackageTable extends AbstractDataCollection<Row> implements Data
 
   private final FeatureDao featureDao;
 
-  private final DataType featureType;
+  private final Schema schema;
 
   private final GeometryFactory geometryFactory;
 
@@ -39,7 +39,7 @@ public class GeoPackageTable extends AbstractDataCollection<Row> implements Data
       var propertyType = classType(column);
       columns.add(new ColumnImpl(propertyName, propertyType));
     }
-    featureType = new DataTypeImpl(name, columns);
+    schema = new SchemaImpl(name, columns);
     geometryFactory = new GeometryFactory(new PrecisionModel(), (int) featureDao.getSrs().getId());
   }
 
@@ -53,30 +53,30 @@ public class GeoPackageTable extends AbstractDataCollection<Row> implements Data
 
   @Override
   public Iterator<Row> iterator() {
-    return new FeatureIterator(featureDao.queryForAll(), featureType);
+    return new FeatureIterator(featureDao.queryForAll(), schema);
   }
 
   @Override
   public long sizeAsLong() {
-    return 0;
+    return featureDao.count();
   }
 
   @Override
-  public DataType dataType() {
-    return null;
+  public Schema schema() {
+    return schema;
   }
 
   public class FeatureIterator implements Iterator<Row> {
 
     private final FeatureResultSet featureResultSet;
 
-    private final DataType dataType;
+    private final Schema schema;
 
     private boolean hasNext;
 
-    public FeatureIterator(FeatureResultSet featureResultSet, DataType dataType) {
+    public FeatureIterator(FeatureResultSet featureResultSet, Schema schema) {
       this.featureResultSet = featureResultSet;
-      this.dataType = dataType;
+      this.schema = schema;
       this.hasNext = featureResultSet.moveToFirst();
     }
 
@@ -90,7 +90,7 @@ public class GeoPackageTable extends AbstractDataCollection<Row> implements Data
       if (!hasNext) {
         throw new NoSuchElementException();
       }
-      Row row = dataType.newInstance();
+      Row row = schema.createRow();
       for (FeatureColumn featureColumn : featureResultSet.getColumns().getColumns()) {
         var value = featureResultSet.getValue(featureColumn);
         if (value != null) {
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/storage/postgres/PostgresDataFrame.java b/baremaps-core/src/main/java/org/apache/baremaps/storage/postgres/PostgresDataFrame.java
index 3c49de7c..994d1d53 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/storage/postgres/PostgresDataFrame.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/storage/postgres/PostgresDataFrame.java
@@ -17,15 +17,15 @@ package org.apache.baremaps.storage.postgres;
 import java.util.Iterator;
 import org.apache.baremaps.collection.AbstractDataCollection;
 import org.apache.baremaps.dataframe.DataFrame;
-import org.apache.baremaps.dataframe.DataType;
 import org.apache.baremaps.dataframe.Row;
+import org.apache.baremaps.dataframe.Schema;
 
 public class PostgresDataFrame extends AbstractDataCollection<Row> implements DataFrame {
 
-  private final DataType dataType;
+  private final Schema schema;
 
-  public PostgresDataFrame(DataType dataType) {
-    this.dataType = dataType;
+  public PostgresDataFrame(Schema schema) {
+    this.schema = schema;
   }
 
   @Override
@@ -39,7 +39,7 @@ public class PostgresDataFrame extends AbstractDataCollection<Row> implements Da
   }
 
   @Override
-  public DataType dataType() {
-    return dataType();
+  public Schema schema() {
+    return schema();
   }
 }
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/storage/postgres/PostgresDatabase.java b/baremaps-core/src/main/java/org/apache/baremaps/storage/postgres/PostgresDatabase.java
index 76df463a..ecfe2f96 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/storage/postgres/PostgresDatabase.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/storage/postgres/PostgresDatabase.java
@@ -19,7 +19,6 @@ import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.util.Collection;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -34,54 +33,48 @@ import org.postgresql.copy.PGCopyOutputStream;
 public class PostgresDatabase implements DataStore {
 
   // TODO: Instantiate with Map.of()
-  private static Map<Class, String> typeToName = new HashMap<>();
-
-  static {
-    typeToName.put(String.class, "varchar");
-    typeToName.put(Short.class, "int2");
-    typeToName.put(Integer.class, "int4");
-    typeToName.put(Long.class, "int8");
-    typeToName.put(Float.class, "float4");
-    typeToName.put(Double.class, "float8");
-    typeToName.put(Geometry.class, "geometry");
-    typeToName.put(Point.class, "geometry");
-    typeToName.put(MultiPoint.class, "geometry");
-    typeToName.put(Point.class, "geometry");
-    typeToName.put(LineString.class, "geometry");
-    typeToName.put(MultiLineString.class, "geometry");
-    typeToName.put(Polygon.class, "geometry");
-    typeToName.put(MultiPolygon.class, "geometry");
-    typeToName.put(LinearRing.class, "geometry");
-    typeToName.put(GeometryCollection.class, "geometry");
-    typeToName.put(LocalDate.class, "date");
-    typeToName.put(LocalTime.class, "time");
-    typeToName.put(LocalDateTime.class, "timestamp");
-  }
+  private static Map<Class, String> typeToName = Map.ofEntries(
+      Map.entry(String.class, "varchar"),
+      Map.entry(Short.class, "int2"),
+      Map.entry(Integer.class, "int4"),
+      Map.entry(Long.class, "int8"),
+      Map.entry(Float.class, "float4"),
+      Map.entry(Double.class, "float8"),
+      Map.entry(Geometry.class, "geometry"),
+      Map.entry(Point.class, "geometry"),
+      Map.entry(MultiPoint.class, "geometry"),
+      Map.entry(Point.class, "geometry"),
+      Map.entry(LineString.class, "geometry"),
+      Map.entry(MultiLineString.class, "geometry"),
+      Map.entry(Polygon.class, "geometry"),
+      Map.entry(MultiPolygon.class, "geometry"),
+      Map.entry(LinearRing.class, "geometry"),
+      Map.entry(GeometryCollection.class, "geometry"),
+      Map.entry(LocalDate.class, "date"),
+      Map.entry(LocalTime.class, "time"),
+      Map.entry(LocalDateTime.class, "timestamp"));
 
   // TODO: Instantiate with Map.of()
-  private static Map<Class, BaseValueHandler> typeToHandler = new HashMap<>();
-
-  static {
-    typeToHandler.put(String.class, new StringValueHandler());
-    typeToHandler.put(Short.class, new ShortValueHandler());
-    typeToHandler.put(Integer.class, new IntegerValueHandler());
-    typeToHandler.put(Long.class, new LongValueHandler());
-    typeToHandler.put(Float.class, new FloatValueHandler());
-    typeToHandler.put(Double.class, new DoubleValueHandler());
-    typeToHandler.put(Geometry.class, new PostgisGeometryValueHandler());
-    typeToHandler.put(Point.class, new PostgisGeometryValueHandler());
-    typeToHandler.put(MultiPoint.class, new PostgisGeometryValueHandler());
-    typeToHandler.put(Point.class, new PostgisGeometryValueHandler());
-    typeToHandler.put(LineString.class, new PostgisGeometryValueHandler());
-    typeToHandler.put(MultiLineString.class, new PostgisGeometryValueHandler());
-    typeToHandler.put(Polygon.class, new PostgisGeometryValueHandler());
-    typeToHandler.put(MultiPolygon.class, new PostgisGeometryValueHandler());
-    typeToHandler.put(LinearRing.class, new PostgisGeometryValueHandler());
-    typeToHandler.put(GeometryCollection.class, new PostgisGeometryValueHandler());
-    typeToHandler.put(LocalDate.class, new LocalDateValueHandler());
-    typeToHandler.put(LocalTime.class, new LocalTimeValueHandler());
-    typeToHandler.put(LocalDateTime.class, new LocalDateTimeValueHandler());
-  }
+  private static Map<Class, BaseValueHandler> typeToHandler = Map.ofEntries(
+      Map.entry(String.class, new StringValueHandler()),
+      Map.entry(Short.class, new ShortValueHandler()),
+      Map.entry(Integer.class, new IntegerValueHandler()),
+      Map.entry(Long.class, new LongValueHandler()),
+      Map.entry(Float.class, new FloatValueHandler()),
+      Map.entry(Double.class, new DoubleValueHandler()),
+      Map.entry(Geometry.class, new PostgisGeometryValueHandler()),
+      Map.entry(Point.class, new PostgisGeometryValueHandler()),
+      Map.entry(MultiPoint.class, new PostgisGeometryValueHandler()),
+      Map.entry(Point.class, new PostgisGeometryValueHandler()),
+      Map.entry(LineString.class, new PostgisGeometryValueHandler()),
+      Map.entry(MultiLineString.class, new PostgisGeometryValueHandler()),
+      Map.entry(Polygon.class, new PostgisGeometryValueHandler()),
+      Map.entry(MultiPolygon.class, new PostgisGeometryValueHandler()),
+      Map.entry(LinearRing.class, new PostgisGeometryValueHandler()),
+      Map.entry(GeometryCollection.class, new PostgisGeometryValueHandler()),
+      Map.entry(LocalDate.class, new LocalDateValueHandler()),
+      Map.entry(LocalTime.class, new LocalTimeValueHandler()),
+      Map.entry(LocalDateTime.class, new LocalDateTimeValueHandler()));
 
   private final DataSource dataSource;
 
@@ -89,16 +82,16 @@ public class PostgresDatabase implements DataStore {
     this.dataSource = dataSource;
   }
 
-  private DataType adaptDataType(DataType datatype) {
+  private Schema adaptDataType(Schema datatype) {
     var name = datatype.name().replaceAll("[^a-zA-Z0-9]", "_");
     var properties = datatype.columns().stream()
         .filter(columnType -> typeToName.containsKey(columnType.type()))
         .toList();
-    return new DataTypeImpl(name, properties);
+    return new SchemaImpl(name, properties);
   }
 
   @Override
-  public Collection<DataFrame> list() throws DataFrameException {
+  public Collection<String> list() throws DataFrameException {
     throw new UnsupportedOperationException();
   }
 
@@ -110,33 +103,33 @@ public class PostgresDatabase implements DataStore {
   @Override
   public void add(DataFrame dataFrame) {
     try (var connection = dataSource.getConnection()) {
-      var dataType = adaptDataType(dataFrame.dataType());
+      var schema = adaptDataType(dataFrame.schema());
 
       // Drop the table if it exists
-      var dropQuery = dropTable(dataType);
+      var dropQuery = dropTable(schema);
       try (var dropStatement = connection.prepareStatement(dropQuery)) {
         dropStatement.execute();
       }
 
       // Create the table
-      var createQuery = createTable(dataType);
+      var createQuery = createTable(schema);
       try (var createStatement = connection.prepareStatement(createQuery)) {
         createStatement.execute();
       }
 
       // Populate the table with a copy query
       PGConnection pgConnection = connection.unwrap(PGConnection.class);
-      var copyQuery = copyTable(dataType);
+      var copyQuery = copyTable(schema);
       try (var writer = new CopyWriter(new PGCopyOutputStream(pgConnection, copyQuery))) {
         writer.writeHeader();
-        var featureIterator = dataFrame.iterator();
-        while (featureIterator.hasNext()) {
-          var feature = featureIterator.next();
-          var attributes = getAttributes(dataType);
-          writer.startRow(attributes.size());
-          for (var attribute : attributes) {
-            var name = attribute.name().toString();
-            var value = feature.get(name);
+        var rowIterator = dataFrame.iterator();
+        while (rowIterator.hasNext()) {
+          var row = rowIterator.next();
+          var columns = getColumns(schema);
+          writer.startRow(columns.size());
+          for (var column : columns) {
+            var name = column.name().toString();
+            var value = row.get(name);
             if (value == null) {
               writer.writeNull();
             } else {
@@ -150,21 +143,22 @@ public class PostgresDatabase implements DataStore {
     }
   }
 
-  private List<Column> getAttributes(DataType dataType) {
-    return dataType.columns().stream()
-        .filter(this::isSupported).collect(Collectors.toList());
+  private List<Column> getColumns(Schema schema) {
+    return schema.columns().stream()
+        .filter(this::isSupported)
+        .collect(Collectors.toList());
   }
 
   private boolean isSupported(Column column) {
     return typeToName.containsKey(column.type());
   }
 
-  private String createTable(DataType dataType) {
+  private String createTable(Schema schema) {
     StringBuilder builder = new StringBuilder();
     builder.append("CREATE TABLE ");
-    builder.append(dataType.name());
+    builder.append(schema.name());
     builder.append(" (");
-    builder.append(dataType.columns().stream()
+    builder.append(schema.columns().stream()
         .map(column -> column.name()
             + " " + typeToName.get(column.type()))
         .collect(Collectors.joining(", ")));
@@ -172,12 +166,12 @@ public class PostgresDatabase implements DataStore {
     return builder.toString();
   }
 
-  private String copyTable(DataType dataType) {
+  private String copyTable(Schema schema) {
     StringBuilder builder = new StringBuilder();
     builder.append("COPY ");
-    builder.append(dataType.name());
+    builder.append(schema.name());
     builder.append(" (");
-    builder.append(dataType.columns().stream()
+    builder.append(schema.columns().stream()
         .map(column -> column.name())
         .collect(Collectors.joining(", ")));
     builder.append(") FROM STDIN BINARY");
@@ -194,7 +188,7 @@ public class PostgresDatabase implements DataStore {
     }
   }
 
-  private String dropTable(DataType type) {
-    return String.format("DROP TABLE IF EXISTS %s CASCADE", type.name());
+  private String dropTable(Schema schema) {
+    return String.format("DROP TABLE IF EXISTS %s CASCADE", schema.name());
   }
 }
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/storage/shapefile/ShapefileDataFrame.java b/baremaps-core/src/main/java/org/apache/baremaps/storage/shapefile/ShapefileDataFrame.java
index 8226ea26..a762de5d 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/storage/shapefile/ShapefileDataFrame.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/storage/shapefile/ShapefileDataFrame.java
@@ -20,8 +20,8 @@ import java.util.NoSuchElementException;
 import org.apache.baremaps.collection.AbstractDataCollection;
 import org.apache.baremaps.dataframe.DataFrame;
 import org.apache.baremaps.dataframe.DataFrameException;
-import org.apache.baremaps.dataframe.DataType;
 import org.apache.baremaps.dataframe.Row;
+import org.apache.baremaps.dataframe.Schema;
 import org.apache.baremaps.storage.shapefile.internal.InputFeatureStream;
 import org.apache.baremaps.storage.shapefile.internal.ShapefileReader;
 
@@ -35,9 +35,9 @@ public class ShapefileDataFrame extends AbstractDataCollection<Row>
   }
 
   @Override
-  public DataType dataType() throws DataFrameException {
+  public Schema schema() throws DataFrameException {
     try (var input = shapeFile.read()) {
-      return input.getDataType();
+      return input.getSchema();
     } catch (IOException e) {
       throw new DataFrameException(e);
     }
@@ -72,14 +72,13 @@ public class ShapefileDataFrame extends AbstractDataCollection<Row>
       this.inputFeatureStream = inputFeatureStream;
     }
 
-
     @Override
     public boolean hasNext() {
       try {
         if (next == null) {
-          next = inputFeatureStream.readFeature();
+          next = inputFeatureStream.readRow();
         }
-        return true;
+        return next != null;
       } catch (IOException exception) {
         return false;
       }
@@ -89,7 +88,7 @@ public class ShapefileDataFrame extends AbstractDataCollection<Row>
     public Row next() {
       try {
         if (next == null) {
-          next = inputFeatureStream.readFeature();
+          next = inputFeatureStream.readRow();
         }
         Row current = next;
         next = null;
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/storage/shapefile/ShapefileDirectory.java b/baremaps-core/src/main/java/org/apache/baremaps/storage/shapefile/ShapefileDirectory.java
index 919bc062..1a7779dc 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/storage/shapefile/ShapefileDirectory.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/storage/shapefile/ShapefileDirectory.java
@@ -31,12 +31,11 @@ public class ShapefileDirectory implements DataStore {
   }
 
   @Override
-  public Collection<DataFrame> list() {
+  public Collection<String> list() {
     try {
       return Files.list(directory)
           .filter(file -> file.toString().toLowerCase().endsWith(".shp"))
-          .map(file -> new ShapefileDataFrame(file))
-          .map(DataFrame.class::cast)
+          .map(file -> file.getFileName().toString())
           .toList();
     } catch (IOException e) {
       throw new DataFrameException(e);
@@ -45,10 +44,7 @@ public class ShapefileDirectory implements DataStore {
 
   @Override
   public DataFrame get(String name) {
-    return list().stream()
-        .filter(dataFrame -> dataFrame.dataType().name().equals(name))
-        .findFirst()
-        .orElseThrow(() -> new DataFrameException());
+    return new ShapefileDataFrame(directory.resolve(name));
   }
 
   @Override
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/storage/shapefile/internal/InputFeatureStream.java b/baremaps-core/src/main/java/org/apache/baremaps/storage/shapefile/internal/InputFeatureStream.java
index 7fb8d72e..4a0b4758 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/storage/shapefile/internal/InputFeatureStream.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/storage/shapefile/internal/InputFeatureStream.java
@@ -17,10 +17,9 @@ package org.apache.baremaps.storage.shapefile.internal;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
-import java.sql.SQLFeatureNotSupportedException;
 import java.util.List;
-import org.apache.baremaps.dataframe.DataType;
 import org.apache.baremaps.dataframe.Row;
+import org.apache.baremaps.dataframe.Schema;
 
 /**
  * Input Stream of features.
@@ -47,8 +46,8 @@ public class InputFeatureStream extends InputStream {
   /** Indicates that the shape file has a valid index provided with it. */
   private boolean hasShapefileIndex;
 
-  /** Type of the features contained in this shapefile. */
-  private DataType dataType;
+  /** Schema of the features contained in this shapefile. */
+  private Schema schema;
 
   /** Shapefile reader. */
   private ShapefileByteReader shapefileReader;
@@ -74,7 +73,7 @@ public class InputFeatureStream extends InputStream {
 
     this.shapefileReader =
         new ShapefileByteReader(this.shapefile, this.databaseFile, this.shapefileIndex);
-    this.dataType = this.shapefileReader.getDataType();
+    this.schema = this.shapefileReader.getSchema();
   }
 
   /**
@@ -113,17 +112,24 @@ public class InputFeatureStream extends InputStream {
    * @throws ShapefileException if the current connection used to query the shapefile has been
    *         closed.
    */
-  public Row readFeature() throws ShapefileException {
-    return internalReadFeature();
+  public Row readRow() throws ShapefileException {
+    if (!this.dbaseReader.nextRowAvailable()) {
+      return null;
+    }
+    Row row = this.schema.createRow();
+    this.dbaseReader.loadRow(row);
+    this.shapefileReader.setRowNum(this.dbaseReader.getRowNum());
+    this.shapefileReader.completeFeature(row);
+    return row;
   }
 
   /**
-   * Return the features type.
+   * Returns the schema.
    *
-   * @return Features type.
+   * @return the schema.
    */
-  public DataType getDataType() {
-    return dataType;
+  public Schema getSchema() {
+    return schema;
   }
 
   /**
@@ -153,21 +159,4 @@ public class InputFeatureStream extends InputStream {
     return this.hasShapefileIndex;
   }
 
-  /**
-   * Read next feature responding to the SQL query.
-   *
-   * @return Feature, null if no more feature is available.
-   * @throws SQLFeatureNotSupportedException if a SQL ability is not currently available through
-   *         this driver.
-   */
-  private Row internalReadFeature() throws ShapefileException {
-    if (!this.dbaseReader.nextRowAvailable()) {
-      return null;
-    }
-    Row row = this.dataType.newInstance();
-    this.dbaseReader.loadRow(row);
-    this.shapefileReader.setRowNum(this.dbaseReader.getRowNum());
-    this.shapefileReader.completeFeature(row);
-    return row;
-  }
 }
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/storage/shapefile/internal/ShapefileByteReader.java b/baremaps-core/src/main/java/org/apache/baremaps/storage/shapefile/internal/ShapefileByteReader.java
index a7572903..dbc44ade 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/storage/shapefile/internal/ShapefileByteReader.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/storage/shapefile/internal/ShapefileByteReader.java
@@ -44,8 +44,8 @@ public class ShapefileByteReader extends CommonByteReader {
   /** Database Field descriptors. */
   private List<DBaseFieldDescriptor> databaseFieldsDescriptors;
 
-  /** Type of the features contained in this shapefile. */
-  private DataType dataType;
+  /** Schema of the features contained in this shapefile. */
+  private Schema schema;
 
   /** Shapefile index. */
   private File shapeFileIndex;
@@ -80,7 +80,7 @@ public class ShapefileByteReader extends CommonByteReader {
       loadShapefileIndexes();
     }
 
-    this.dataType = getDataType(shapefile.getName());
+    this.schema = getSchema(shapefile.getName());
   }
 
   /**
@@ -102,12 +102,12 @@ public class ShapefileByteReader extends CommonByteReader {
   }
 
   /**
-   * Returns the type of the features contained in this shapefile.
+   * Returns the schema of the data contained in this shapefile.
    *
-   * @return Features type.
+   * @return the schema
    */
-  public DataType getDataType() {
-    return this.dataType;
+  public Schema getSchema() {
+    return this.schema;
   }
 
   /**
@@ -116,14 +116,14 @@ public class ShapefileByteReader extends CommonByteReader {
    * @param name Name of the field.
    * @return The feature type.
    */
-  private DataType getDataType(final String name) {
+  private Schema getSchema(final String name) {
     Objects.requireNonNull(name, "The feature name cannot be null.");
 
     var columns = new ArrayList<Column>();
     for (int i = 0; i < databaseFieldsDescriptors.size(); i++) {
       var fieldDescriptor = this.databaseFieldsDescriptors.get(i);
-      var propertyName = fieldDescriptor.getName();
-      var propertyType = switch (fieldDescriptor.getType()) {
+      var columnName = fieldDescriptor.getName();
+      var columnType = switch (fieldDescriptor.getType()) {
         case Character -> String.class;
         case Number -> fieldDescriptor.getDecimalCount() == 0 ? Long.class : Double.class;
         case Currency -> Double.class;
@@ -143,13 +143,13 @@ public class ShapefileByteReader extends CommonByteReader {
         case DateTime -> String.class;
       };
 
-      columns.add(new ColumnImpl(propertyName, propertyType));
+      columns.add(new ColumnImpl(columnName, columnType));
     }
 
     // Add geometry column.
     columns.add(new ColumnImpl(GEOMETRY_NAME, Geometry.class));
 
-    return new DataTypeImpl(name, columns);
+    return new SchemaImpl(name, columns);
   }
 
   /** Load shapefile descriptor. */
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/storage/shapefile/internal/ShapefileReader.java b/baremaps-core/src/main/java/org/apache/baremaps/storage/shapefile/internal/ShapefileReader.java
index 9d5314ec..3b3d5c52 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/storage/shapefile/internal/ShapefileReader.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/storage/shapefile/internal/ShapefileReader.java
@@ -18,7 +18,7 @@ import java.io.File;
 import java.io.IOException;
 import java.util.List;
 import java.util.Objects;
-import org.apache.baremaps.dataframe.DataType;
+import org.apache.baremaps.dataframe.Schema;
 
 /**
  * Provides a ShapeFile Reader.
@@ -44,7 +44,7 @@ public class ShapefileReader {
   private File shapeFileIndex;
 
   /** Type of the features contained in this shapefile. */
-  private DataType dataType;
+  private Schema schema;
 
   /** Shapefile descriptor. */
   private ShapefileDescriptor shapefileDescriptor;
@@ -113,12 +113,12 @@ public class ShapefileReader {
   }
 
   /**
-   * Return the default feature type.
+   * Return the schema.
    *
-   * @return Feature type.
+   * @return the schema.
    */
-  public DataType getDataType() {
-    return this.dataType;
+  public Schema getSchema() {
+    return this.schema;
   }
 
   /**
@@ -174,7 +174,7 @@ public class ShapefileReader {
   public InputFeatureStream read() throws IOException {
     InputFeatureStream is =
         new InputFeatureStream(this.shapefile, this.databaseFile, this.shapeFileIndex);
-    this.dataType = is.getDataType();
+    this.schema = is.getSchema();
     this.shapefileDescriptor = is.getShapefileDescriptor();
     this.databaseFieldsDescriptors = is.getDatabaseFieldsDescriptors();
     return is;
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/Entity.java b/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/Entity.java
index b173a0c2..e43c1163 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/Entity.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/Entity.java
@@ -34,29 +34,29 @@ public class Entity implements Row {
 
 
   @Override
-  public DataType dataType() {
+  public Schema dataType() {
     var columns = new ArrayList<Column>();
     columns.add(new ColumnImpl("id", Long.class));
     columns.add(new ColumnImpl("geometry", Geometry.class));
     for (var entry : tags.entrySet()) {
       columns.add(new ColumnImpl(entry.getKey(), String.class));
     }
-    return new DataTypeImpl("entity", columns);
+    return new SchemaImpl("entity", columns);
   }
 
   @Override
-  public void set(String name, Object value) {
-    tags.put(name, value.toString());
+  public void set(String column, Object value) {
+    tags.put(column, value.toString());
   }
 
   @Override
-  public Object get(String name) {
-    if (name.equals("id")) {
+  public Object get(String column) {
+    if (column.equals("id")) {
       return id;
-    } else if (name.equals("geometry")) {
+    } else if (column.equals("geometry")) {
       return geometry;
     } else {
-      return tags.get(name);
+      return tags.get(column);
     }
   }
 
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/ImportGeoPackage.java b/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/ImportGeoPackage.java
index 735127df..784d093e 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/ImportGeoPackage.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/ImportGeoPackage.java
@@ -14,7 +14,7 @@ package org.apache.baremaps.workflow.tasks;
 
 import java.nio.file.Path;
 import org.apache.baremaps.openstreetmap.utils.ProjectionTransformer;
-import org.apache.baremaps.storage.DataFrameProjectionTransform;
+import org.apache.baremaps.storage.DataFrameGeometryTransformer;
 import org.apache.baremaps.storage.geopackage.GeoPackageDatabase;
 import org.apache.baremaps.storage.postgres.PostgresDatabase;
 import org.apache.baremaps.workflow.Task;
@@ -38,7 +38,7 @@ public record ImportGeoPackage(Path file, String database, Integer sourceSRID, I
       var postgresDatabase = new PostgresDatabase(dataSource);
       for (var dataFrame : geoPackageStore.list()) {
         var transformer = new ProjectionTransformer(sourceSRID, targetSRID);
-        var transformedDataFrame = new DataFrameProjectionTransform(dataFrame, transformer);
+        var transformedDataFrame = new DataFrameGeometryTransformer(dataFrame, transformer);
         postgresDatabase.add(transformedDataFrame);
       }
       logger.info("Finished importing {} into {}", file, database);
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/ImportShapefile.java b/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/ImportShapefile.java
index 4582efe6..95745562 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/ImportShapefile.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/ImportShapefile.java
@@ -14,7 +14,7 @@ package org.apache.baremaps.workflow.tasks;
 
 import java.nio.file.Path;
 import org.apache.baremaps.openstreetmap.utils.ProjectionTransformer;
-import org.apache.baremaps.storage.DataFrameProjectionTransform;
+import org.apache.baremaps.storage.DataFrameGeometryTransformer;
 import org.apache.baremaps.storage.postgres.PostgresDatabase;
 import org.apache.baremaps.storage.shapefile.ShapefileDataFrame;
 import org.apache.baremaps.workflow.Task;
@@ -36,7 +36,7 @@ public record ImportShapefile(Path file, String database, Integer sourceSRID, In
     try (var featureSet = new ShapefileDataFrame(path)) {
       var dataSource = context.getDataSource(database);
       var postgresDatabase = new PostgresDatabase(dataSource);
-      postgresDatabase.add(new DataFrameProjectionTransform(
+      postgresDatabase.add(new DataFrameGeometryTransformer(
           featureSet, new ProjectionTransformer(sourceSRID, targetSRID)));
       logger.info("Finished importing {} into {}", file, database);
     } catch (Exception e) {
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/TransformEntityCollection.java b/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/TransformEntityCollection.java
index f2cc47b3..afcd0fff 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/TransformEntityCollection.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/TransformEntityCollection.java
@@ -53,7 +53,7 @@ public record TransformEntityCollection(Path collection, String database,
   public void execute(WorkflowContext context) throws Exception {
     logger.info("Transform {} with {}", collection, recipe);
 
-    var dataType = new DataTypeImpl(recipe.name, columns());
+    var dataType = new SchemaImpl(recipe.name, columns());
 
     var groups = new AppendOnlyBuffer<>(new EntityDataType(), new MemoryMappedFile(collection))
         .stream()
@@ -71,7 +71,7 @@ public record TransformEntityCollection(Path collection, String database,
     var dataFrame = new AbstractDataFrame() {
 
       @Override
-      public DataType dataType() {
+      public Schema schema() {
         return dataType;
       }
 
diff --git a/baremaps-core/src/test/java/org/apache/baremaps/mvt/ExpressionsTest.java b/baremaps-core/src/test/java/org/apache/baremaps/mvt/ExpressionsTest.java
index 83e7b80b..629ea6c1 100644
--- a/baremaps-core/src/test/java/org/apache/baremaps/mvt/ExpressionsTest.java
+++ b/baremaps-core/src/test/java/org/apache/baremaps/mvt/ExpressionsTest.java
@@ -17,8 +17,8 @@ import static org.junit.jupiter.api.Assertions.*;
 import java.io.IOException;
 import java.util.List;
 import java.util.Map;
-import org.apache.baremaps.dataframe.DataType;
 import org.apache.baremaps.dataframe.Row;
+import org.apache.baremaps.dataframe.Schema;
 import org.apache.baremaps.mvt.expression.Expressions;
 import org.apache.baremaps.mvt.expression.Expressions.*;
 import org.junit.jupiter.api.Test;
@@ -28,7 +28,7 @@ class ExpressionsTest {
   record RowMock(Map<String, Object> properties) implements Row {
 
     @Override
-    public DataType dataType() {
+    public Schema dataType() {
       throw new UnsupportedOperationException();
     }
 
@@ -38,13 +38,13 @@ class ExpressionsTest {
     }
 
     @Override
-    public void set(String name, Object value) {
-      properties.put(name, value);
+    public void set(String column, Object value) {
+      properties.put(column, value);
     }
 
     @Override
-    public Object get(String name) {
-      return properties.get(name);
+    public Object get(String column) {
+      return properties.get(column);
     }
 
   }
diff --git a/baremaps-core/src/test/java/org/apache/baremaps/storage/flatgeobuf/FlatGeoBufFeatureSetTest.java b/baremaps-core/src/test/java/org/apache/baremaps/storage/flatgeobuf/FlatGeoBufDataFrameTest.java
similarity index 82%
rename from baremaps-core/src/test/java/org/apache/baremaps/storage/flatgeobuf/FlatGeoBufFeatureSetTest.java
rename to baremaps-core/src/test/java/org/apache/baremaps/storage/flatgeobuf/FlatGeoBufDataFrameTest.java
index a47088be..32b8fab2 100644
--- a/baremaps-core/src/test/java/org/apache/baremaps/storage/flatgeobuf/FlatGeoBufFeatureSetTest.java
+++ b/baremaps-core/src/test/java/org/apache/baremaps/storage/flatgeobuf/FlatGeoBufDataFrameTest.java
@@ -21,13 +21,13 @@ import java.nio.file.StandardOpenOption;
 import org.apache.baremaps.testing.TestFiles;
 import org.junit.jupiter.api.Test;
 
-class FlatGeoBufFeatureSetTest {
+class FlatGeoBufDataFrameTest {
 
   @Test
   void getType() throws IOException {
     try (var channel = FileChannel.open(TestFiles.resolve("countries.fgb"))) {
-      var featureSet = new FlatGeoBufFeatureSet(channel);
-      var featureType = featureSet.getType();
+      var featureSet = new FlatGeoBufDataFrame(channel);
+      var featureType = featureSet.getSchema();
       assertEquals(featureType.name(), null);
       assertEquals(featureType.columns().size(), 2);
     }
@@ -36,7 +36,7 @@ class FlatGeoBufFeatureSetTest {
   @Test
   void read() throws IOException {
     try (var channel = FileChannel.open(TestFiles.resolve("countries.fgb"))) {
-      var featureSet = new FlatGeoBufFeatureSet(channel);
+      var featureSet = new FlatGeoBufDataFrame(channel);
       assertEquals(179, featureSet.read().size());
       assertEquals(179, featureSet.read().stream().count());
     }
@@ -48,14 +48,14 @@ class FlatGeoBufFeatureSetTest {
     file.toFile().deleteOnExit();
     try (var channel1 = FileChannel.open(TestFiles.resolve("countries.fgb"));
         var channel2 = FileChannel.open(file, StandardOpenOption.WRITE)) {
-      var featureSet1 = new FlatGeoBufFeatureSet(channel1);
+      var featureSet1 = new FlatGeoBufDataFrame(channel1);
       var featureList = featureSet1.read().stream().toList();
-      var featureSet2 = new FlatGeoBufFeatureSet(channel2, featureSet1.getType());
+      var featureSet2 = new FlatGeoBufDataFrame(channel2, featureSet1.getSchema());
       featureSet2.write(featureList);
     }
 
     try (var channel = FileChannel.open(file, StandardOpenOption.READ)) {
-      var featureSet = new FlatGeoBufFeatureSet(channel);
+      var featureSet = new FlatGeoBufDataFrame(channel);
       assertEquals(179, featureSet.read().size());
     }
   }