github-advanced-security[bot] commented on code in PR #901:
URL: 
https://github.com/apache/incubator-baremaps/pull/901#discussion_r1823367880


##########
baremaps-core/src/test/java/org/apache/baremaps/storage/csv/CsvDataTableGeonamesTest.java:
##########
@@ -0,0 +1,141 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.baremaps.storage.csv;
+
+import static org.apache.baremaps.testing.TestFiles.GEONAMES_CSV;
+import static org.junit.jupiter.api.Assertions.*;
+
+import java.io.IOException;
+import java.util.List;
+import org.apache.baremaps.data.storage.*;
+import org.junit.jupiter.api.*;
+import org.locationtech.jts.geom.Point;
+
+class CsvDataTableGeonamesTest {
+
+  @Test
+  void testGeonamesCsvDataTable() throws IOException {
+    List<DataColumn> columns = List.of(
+        new DataColumnFixed("id", DataColumn.Cardinality.REQUIRED, 
DataColumn.Type.INTEGER),
+        new DataColumnFixed("name", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("asciiname", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("alternatenames", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("latitude", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.DOUBLE),
+        new DataColumnFixed("longitude", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.DOUBLE),
+        new DataColumnFixed("feature_class", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("feature_code", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("country_code", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("cc2", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin1_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin2_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin3_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin4_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("population", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.LONG),
+        new DataColumnFixed("elevation", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.INTEGER),
+        new DataColumnFixed("dem", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.INTEGER),
+        new DataColumnFixed("timezone", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("modification_date", 
DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING));
+    DataSchema schema = new DataSchemaImpl("geonames", columns);
+
+    boolean hasHeader = false;
+    char separator = '\t';
+    DataTable dataTable = new CsvDataTable(schema, GEONAMES_CSV.toFile(), 
hasHeader, separator);
+
+    assertEquals(5, dataTable.size(), "DataTable should have 5 rows.");
+
+    int rowCount = 0;
+    for (DataRow row : dataTable) {
+      rowCount++;
+
+      // Extract values
+      Integer id = (Integer) row.get("id");
+      String name = (String) row.get("name");
+      String asciiname = (String) row.get("asciiname");
+      String alternatenames = (String) row.get("alternatenames");

Review Comment:
   ## Unread local variable
   
   Variable 'String alternatenames' is never read.
   
   [Show more 
details](https://github.com/apache/incubator-baremaps/security/code-scanning/1588)



##########
baremaps-core/src/test/java/org/apache/baremaps/storage/csv/CsvDataTableGeonamesTest.java:
##########
@@ -0,0 +1,141 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.baremaps.storage.csv;
+
+import static org.apache.baremaps.testing.TestFiles.GEONAMES_CSV;
+import static org.junit.jupiter.api.Assertions.*;
+
+import java.io.IOException;
+import java.util.List;
+import org.apache.baremaps.data.storage.*;
+import org.junit.jupiter.api.*;
+import org.locationtech.jts.geom.Point;
+
+class CsvDataTableGeonamesTest {
+
+  @Test
+  void testGeonamesCsvDataTable() throws IOException {
+    List<DataColumn> columns = List.of(
+        new DataColumnFixed("id", DataColumn.Cardinality.REQUIRED, 
DataColumn.Type.INTEGER),
+        new DataColumnFixed("name", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("asciiname", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("alternatenames", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("latitude", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.DOUBLE),
+        new DataColumnFixed("longitude", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.DOUBLE),
+        new DataColumnFixed("feature_class", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("feature_code", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("country_code", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("cc2", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin1_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin2_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin3_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin4_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("population", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.LONG),
+        new DataColumnFixed("elevation", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.INTEGER),
+        new DataColumnFixed("dem", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.INTEGER),
+        new DataColumnFixed("timezone", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("modification_date", 
DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING));
+    DataSchema schema = new DataSchemaImpl("geonames", columns);
+
+    boolean hasHeader = false;
+    char separator = '\t';
+    DataTable dataTable = new CsvDataTable(schema, GEONAMES_CSV.toFile(), 
hasHeader, separator);
+
+    assertEquals(5, dataTable.size(), "DataTable should have 5 rows.");
+
+    int rowCount = 0;
+    for (DataRow row : dataTable) {
+      rowCount++;
+
+      // Extract values
+      Integer id = (Integer) row.get("id");
+      String name = (String) row.get("name");
+      String asciiname = (String) row.get("asciiname");

Review Comment:
   ## Unread local variable
   
   Variable 'String asciiname' is never read.
   
   [Show more 
details](https://github.com/apache/incubator-baremaps/security/code-scanning/1587)



##########
baremaps-core/src/test/java/org/apache/baremaps/storage/csv/CsvDataTableGeonamesTest.java:
##########
@@ -0,0 +1,141 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.baremaps.storage.csv;
+
+import static org.apache.baremaps.testing.TestFiles.GEONAMES_CSV;
+import static org.junit.jupiter.api.Assertions.*;
+
+import java.io.IOException;
+import java.util.List;
+import org.apache.baremaps.data.storage.*;
+import org.junit.jupiter.api.*;
+import org.locationtech.jts.geom.Point;
+
+class CsvDataTableGeonamesTest {
+
+  @Test
+  void testGeonamesCsvDataTable() throws IOException {
+    List<DataColumn> columns = List.of(
+        new DataColumnFixed("id", DataColumn.Cardinality.REQUIRED, 
DataColumn.Type.INTEGER),
+        new DataColumnFixed("name", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("asciiname", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("alternatenames", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("latitude", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.DOUBLE),
+        new DataColumnFixed("longitude", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.DOUBLE),
+        new DataColumnFixed("feature_class", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("feature_code", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("country_code", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("cc2", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin1_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin2_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin3_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin4_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("population", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.LONG),
+        new DataColumnFixed("elevation", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.INTEGER),
+        new DataColumnFixed("dem", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.INTEGER),
+        new DataColumnFixed("timezone", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("modification_date", 
DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING));
+    DataSchema schema = new DataSchemaImpl("geonames", columns);
+
+    boolean hasHeader = false;
+    char separator = '\t';
+    DataTable dataTable = new CsvDataTable(schema, GEONAMES_CSV.toFile(), 
hasHeader, separator);
+
+    assertEquals(5, dataTable.size(), "DataTable should have 5 rows.");
+
+    int rowCount = 0;
+    for (DataRow row : dataTable) {
+      rowCount++;
+
+      // Extract values
+      Integer id = (Integer) row.get("id");
+      String name = (String) row.get("name");
+      String asciiname = (String) row.get("asciiname");
+      String alternatenames = (String) row.get("alternatenames");
+      Double latitude = (Double) row.get("latitude");
+      Double longitude = (Double) row.get("longitude");
+      String featureClass = (String) row.get("feature_class");
+      String featureCode = (String) row.get("feature_code");
+      String countryCode = (String) row.get("country_code");
+      String cc2 = (String) row.get("cc2");

Review Comment:
   ## Unread local variable
   
   Variable 'String cc2' is never read.
   
   [Show more 
details](https://github.com/apache/incubator-baremaps/security/code-scanning/1592)



##########
baremaps-core/src/test/java/org/apache/baremaps/storage/csv/CsvDataTableGeonamesTest.java:
##########
@@ -0,0 +1,141 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.baremaps.storage.csv;
+
+import static org.apache.baremaps.testing.TestFiles.GEONAMES_CSV;
+import static org.junit.jupiter.api.Assertions.*;
+
+import java.io.IOException;
+import java.util.List;
+import org.apache.baremaps.data.storage.*;
+import org.junit.jupiter.api.*;
+import org.locationtech.jts.geom.Point;
+
+class CsvDataTableGeonamesTest {
+
+  @Test
+  void testGeonamesCsvDataTable() throws IOException {
+    List<DataColumn> columns = List.of(
+        new DataColumnFixed("id", DataColumn.Cardinality.REQUIRED, 
DataColumn.Type.INTEGER),
+        new DataColumnFixed("name", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("asciiname", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("alternatenames", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("latitude", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.DOUBLE),
+        new DataColumnFixed("longitude", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.DOUBLE),
+        new DataColumnFixed("feature_class", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("feature_code", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("country_code", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("cc2", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin1_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin2_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin3_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin4_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("population", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.LONG),
+        new DataColumnFixed("elevation", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.INTEGER),
+        new DataColumnFixed("dem", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.INTEGER),
+        new DataColumnFixed("timezone", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("modification_date", 
DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING));
+    DataSchema schema = new DataSchemaImpl("geonames", columns);
+
+    boolean hasHeader = false;
+    char separator = '\t';
+    DataTable dataTable = new CsvDataTable(schema, GEONAMES_CSV.toFile(), 
hasHeader, separator);
+
+    assertEquals(5, dataTable.size(), "DataTable should have 5 rows.");
+
+    int rowCount = 0;
+    for (DataRow row : dataTable) {
+      rowCount++;
+
+      // Extract values
+      Integer id = (Integer) row.get("id");
+      String name = (String) row.get("name");
+      String asciiname = (String) row.get("asciiname");
+      String alternatenames = (String) row.get("alternatenames");
+      Double latitude = (Double) row.get("latitude");
+      Double longitude = (Double) row.get("longitude");
+      String featureClass = (String) row.get("feature_class");

Review Comment:
   ## Unread local variable
   
   Variable 'String featureClass' is never read.
   
   [Show more 
details](https://github.com/apache/incubator-baremaps/security/code-scanning/1589)



##########
baremaps-core/src/test/java/org/apache/baremaps/storage/csv/CsvDataTableTest.java:
##########
@@ -0,0 +1,192 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.baremaps.storage.csv;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.util.List;
+import org.apache.baremaps.data.storage.*;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.locationtech.jts.geom.Geometry;
+
+class CsvDataTableTest {
+
+  private File tempCsvFile;
+
+  @BeforeEach
+  void setUp() throws IOException {
+    tempCsvFile = File.createTempFile("test", ".csv");

Review Comment:
   ## Local information disclosure in a temporary directory
   
   Local information disclosure vulnerability due to use of file readable by 
other local users.
   
   [Show more 
details](https://github.com/apache/incubator-baremaps/security/code-scanning/1603)



##########
baremaps-core/src/test/java/org/apache/baremaps/storage/csv/CsvDataTableGeonamesTest.java:
##########
@@ -0,0 +1,141 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.baremaps.storage.csv;
+
+import static org.apache.baremaps.testing.TestFiles.GEONAMES_CSV;
+import static org.junit.jupiter.api.Assertions.*;
+
+import java.io.IOException;
+import java.util.List;
+import org.apache.baremaps.data.storage.*;
+import org.junit.jupiter.api.*;
+import org.locationtech.jts.geom.Point;
+
+class CsvDataTableGeonamesTest {
+
+  @Test
+  void testGeonamesCsvDataTable() throws IOException {
+    List<DataColumn> columns = List.of(
+        new DataColumnFixed("id", DataColumn.Cardinality.REQUIRED, 
DataColumn.Type.INTEGER),
+        new DataColumnFixed("name", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("asciiname", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("alternatenames", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("latitude", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.DOUBLE),
+        new DataColumnFixed("longitude", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.DOUBLE),
+        new DataColumnFixed("feature_class", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("feature_code", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("country_code", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("cc2", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin1_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin2_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin3_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin4_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("population", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.LONG),
+        new DataColumnFixed("elevation", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.INTEGER),
+        new DataColumnFixed("dem", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.INTEGER),
+        new DataColumnFixed("timezone", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("modification_date", 
DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING));
+    DataSchema schema = new DataSchemaImpl("geonames", columns);
+
+    boolean hasHeader = false;
+    char separator = '\t';
+    DataTable dataTable = new CsvDataTable(schema, GEONAMES_CSV.toFile(), 
hasHeader, separator);
+
+    assertEquals(5, dataTable.size(), "DataTable should have 5 rows.");
+
+    int rowCount = 0;
+    for (DataRow row : dataTable) {
+      rowCount++;
+
+      // Extract values
+      Integer id = (Integer) row.get("id");
+      String name = (String) row.get("name");
+      String asciiname = (String) row.get("asciiname");
+      String alternatenames = (String) row.get("alternatenames");
+      Double latitude = (Double) row.get("latitude");
+      Double longitude = (Double) row.get("longitude");
+      String featureClass = (String) row.get("feature_class");
+      String featureCode = (String) row.get("feature_code");
+      String countryCode = (String) row.get("country_code");
+      String cc2 = (String) row.get("cc2");
+      String admin1Code = (String) row.get("admin1_code");
+      String admin2Code = (String) row.get("admin2_code");
+      String admin3Code = (String) row.get("admin3_code");
+      String admin4Code = (String) row.get("admin4_code");

Review Comment:
   ## Unread local variable
   
   Variable 'String admin4Code' is never read.
   
   [Show more 
details](https://github.com/apache/incubator-baremaps/security/code-scanning/1596)



##########
baremaps-core/src/test/java/org/apache/baremaps/storage/csv/CsvDataTableGeonamesTest.java:
##########
@@ -0,0 +1,141 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.baremaps.storage.csv;
+
+import static org.apache.baremaps.testing.TestFiles.GEONAMES_CSV;
+import static org.junit.jupiter.api.Assertions.*;
+
+import java.io.IOException;
+import java.util.List;
+import org.apache.baremaps.data.storage.*;
+import org.junit.jupiter.api.*;
+import org.locationtech.jts.geom.Point;
+
+class CsvDataTableGeonamesTest {
+
+  @Test
+  void testGeonamesCsvDataTable() throws IOException {
+    List<DataColumn> columns = List.of(
+        new DataColumnFixed("id", DataColumn.Cardinality.REQUIRED, 
DataColumn.Type.INTEGER),
+        new DataColumnFixed("name", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("asciiname", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("alternatenames", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("latitude", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.DOUBLE),
+        new DataColumnFixed("longitude", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.DOUBLE),
+        new DataColumnFixed("feature_class", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("feature_code", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("country_code", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("cc2", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin1_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin2_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin3_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin4_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("population", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.LONG),
+        new DataColumnFixed("elevation", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.INTEGER),
+        new DataColumnFixed("dem", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.INTEGER),
+        new DataColumnFixed("timezone", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("modification_date", 
DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING));
+    DataSchema schema = new DataSchemaImpl("geonames", columns);
+
+    boolean hasHeader = false;
+    char separator = '\t';
+    DataTable dataTable = new CsvDataTable(schema, GEONAMES_CSV.toFile(), 
hasHeader, separator);
+
+    assertEquals(5, dataTable.size(), "DataTable should have 5 rows.");
+
+    int rowCount = 0;
+    for (DataRow row : dataTable) {
+      rowCount++;
+
+      // Extract values
+      Integer id = (Integer) row.get("id");
+      String name = (String) row.get("name");
+      String asciiname = (String) row.get("asciiname");
+      String alternatenames = (String) row.get("alternatenames");
+      Double latitude = (Double) row.get("latitude");
+      Double longitude = (Double) row.get("longitude");
+      String featureClass = (String) row.get("feature_class");
+      String featureCode = (String) row.get("feature_code");
+      String countryCode = (String) row.get("country_code");
+      String cc2 = (String) row.get("cc2");
+      String admin1Code = (String) row.get("admin1_code");
+      String admin2Code = (String) row.get("admin2_code");
+      String admin3Code = (String) row.get("admin3_code");
+      String admin4Code = (String) row.get("admin4_code");
+      Long population = (Long) row.get("population");
+      Integer elevation = (Integer) row.get("elevation");
+      Integer dem = (Integer) row.get("dem");

Review Comment:
   ## Unread local variable
   
   Variable 'Integer dem' is never read.
   
   [Show more 
details](https://github.com/apache/incubator-baremaps/security/code-scanning/1599)



##########
baremaps-core/src/test/java/org/apache/baremaps/storage/csv/CsvDataTableGeonamesTest.java:
##########
@@ -0,0 +1,141 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.baremaps.storage.csv;
+
+import static org.apache.baremaps.testing.TestFiles.GEONAMES_CSV;
+import static org.junit.jupiter.api.Assertions.*;
+
+import java.io.IOException;
+import java.util.List;
+import org.apache.baremaps.data.storage.*;
+import org.junit.jupiter.api.*;
+import org.locationtech.jts.geom.Point;
+
+class CsvDataTableGeonamesTest {
+
+  @Test
+  void testGeonamesCsvDataTable() throws IOException {
+    List<DataColumn> columns = List.of(
+        new DataColumnFixed("id", DataColumn.Cardinality.REQUIRED, 
DataColumn.Type.INTEGER),
+        new DataColumnFixed("name", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("asciiname", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("alternatenames", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("latitude", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.DOUBLE),
+        new DataColumnFixed("longitude", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.DOUBLE),
+        new DataColumnFixed("feature_class", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("feature_code", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("country_code", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("cc2", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin1_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin2_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin3_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin4_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("population", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.LONG),
+        new DataColumnFixed("elevation", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.INTEGER),
+        new DataColumnFixed("dem", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.INTEGER),
+        new DataColumnFixed("timezone", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("modification_date", 
DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING));
+    DataSchema schema = new DataSchemaImpl("geonames", columns);
+
+    boolean hasHeader = false;
+    char separator = '\t';
+    DataTable dataTable = new CsvDataTable(schema, GEONAMES_CSV.toFile(), 
hasHeader, separator);
+
+    assertEquals(5, dataTable.size(), "DataTable should have 5 rows.");
+
+    int rowCount = 0;
+    for (DataRow row : dataTable) {
+      rowCount++;
+
+      // Extract values
+      Integer id = (Integer) row.get("id");
+      String name = (String) row.get("name");
+      String asciiname = (String) row.get("asciiname");
+      String alternatenames = (String) row.get("alternatenames");
+      Double latitude = (Double) row.get("latitude");
+      Double longitude = (Double) row.get("longitude");
+      String featureClass = (String) row.get("feature_class");
+      String featureCode = (String) row.get("feature_code");
+      String countryCode = (String) row.get("country_code");
+      String cc2 = (String) row.get("cc2");
+      String admin1Code = (String) row.get("admin1_code");

Review Comment:
   ## Unread local variable
   
   Variable 'String admin1Code' is never read.
   
   [Show more 
details](https://github.com/apache/incubator-baremaps/security/code-scanning/1593)



##########
baremaps-core/src/test/java/org/apache/baremaps/storage/csv/CsvDataTableGeonamesTest.java:
##########
@@ -0,0 +1,141 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.baremaps.storage.csv;
+
+import static org.apache.baremaps.testing.TestFiles.GEONAMES_CSV;
+import static org.junit.jupiter.api.Assertions.*;
+
+import java.io.IOException;
+import java.util.List;
+import org.apache.baremaps.data.storage.*;
+import org.junit.jupiter.api.*;
+import org.locationtech.jts.geom.Point;
+
+class CsvDataTableGeonamesTest {
+
+  @Test
+  void testGeonamesCsvDataTable() throws IOException {
+    List<DataColumn> columns = List.of(
+        new DataColumnFixed("id", DataColumn.Cardinality.REQUIRED, 
DataColumn.Type.INTEGER),
+        new DataColumnFixed("name", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("asciiname", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("alternatenames", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("latitude", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.DOUBLE),
+        new DataColumnFixed("longitude", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.DOUBLE),
+        new DataColumnFixed("feature_class", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("feature_code", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("country_code", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("cc2", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin1_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin2_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin3_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin4_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("population", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.LONG),
+        new DataColumnFixed("elevation", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.INTEGER),
+        new DataColumnFixed("dem", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.INTEGER),
+        new DataColumnFixed("timezone", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("modification_date", 
DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING));
+    DataSchema schema = new DataSchemaImpl("geonames", columns);
+
+    boolean hasHeader = false;
+    char separator = '\t';
+    DataTable dataTable = new CsvDataTable(schema, GEONAMES_CSV.toFile(), 
hasHeader, separator);
+
+    assertEquals(5, dataTable.size(), "DataTable should have 5 rows.");
+
+    int rowCount = 0;
+    for (DataRow row : dataTable) {
+      rowCount++;
+
+      // Extract values
+      Integer id = (Integer) row.get("id");
+      String name = (String) row.get("name");
+      String asciiname = (String) row.get("asciiname");
+      String alternatenames = (String) row.get("alternatenames");
+      Double latitude = (Double) row.get("latitude");
+      Double longitude = (Double) row.get("longitude");
+      String featureClass = (String) row.get("feature_class");
+      String featureCode = (String) row.get("feature_code");
+      String countryCode = (String) row.get("country_code");
+      String cc2 = (String) row.get("cc2");
+      String admin1Code = (String) row.get("admin1_code");
+      String admin2Code = (String) row.get("admin2_code");
+      String admin3Code = (String) row.get("admin3_code");
+      String admin4Code = (String) row.get("admin4_code");
+      Long population = (Long) row.get("population");

Review Comment:
   ## Unread local variable
   
   Variable 'Long population' is never read.
   
   [Show more 
details](https://github.com/apache/incubator-baremaps/security/code-scanning/1597)



##########
baremaps-core/src/test/java/org/apache/baremaps/storage/csv/CsvDataTableGeonamesTest.java:
##########
@@ -0,0 +1,141 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.baremaps.storage.csv;
+
+import static org.apache.baremaps.testing.TestFiles.GEONAMES_CSV;
+import static org.junit.jupiter.api.Assertions.*;
+
+import java.io.IOException;
+import java.util.List;
+import org.apache.baremaps.data.storage.*;
+import org.junit.jupiter.api.*;
+import org.locationtech.jts.geom.Point;
+
+class CsvDataTableGeonamesTest {
+
+  @Test
+  void testGeonamesCsvDataTable() throws IOException {
+    List<DataColumn> columns = List.of(
+        new DataColumnFixed("id", DataColumn.Cardinality.REQUIRED, 
DataColumn.Type.INTEGER),
+        new DataColumnFixed("name", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("asciiname", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("alternatenames", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("latitude", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.DOUBLE),
+        new DataColumnFixed("longitude", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.DOUBLE),
+        new DataColumnFixed("feature_class", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("feature_code", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("country_code", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("cc2", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin1_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin2_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin3_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin4_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("population", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.LONG),
+        new DataColumnFixed("elevation", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.INTEGER),
+        new DataColumnFixed("dem", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.INTEGER),
+        new DataColumnFixed("timezone", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("modification_date", 
DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING));
+    DataSchema schema = new DataSchemaImpl("geonames", columns);
+
+    boolean hasHeader = false;
+    char separator = '\t';
+    DataTable dataTable = new CsvDataTable(schema, GEONAMES_CSV.toFile(), 
hasHeader, separator);
+
+    assertEquals(5, dataTable.size(), "DataTable should have 5 rows.");
+
+    int rowCount = 0;
+    for (DataRow row : dataTable) {
+      rowCount++;
+
+      // Extract values
+      Integer id = (Integer) row.get("id");
+      String name = (String) row.get("name");
+      String asciiname = (String) row.get("asciiname");
+      String alternatenames = (String) row.get("alternatenames");
+      Double latitude = (Double) row.get("latitude");
+      Double longitude = (Double) row.get("longitude");
+      String featureClass = (String) row.get("feature_class");
+      String featureCode = (String) row.get("feature_code");

Review Comment:
   ## Unread local variable
   
   Variable 'String featureCode' is never read.
   
   [Show more 
details](https://github.com/apache/incubator-baremaps/security/code-scanning/1590)



##########
baremaps-core/src/test/java/org/apache/baremaps/storage/csv/CsvDataTableGeonamesTest.java:
##########
@@ -0,0 +1,141 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.baremaps.storage.csv;
+
+import static org.apache.baremaps.testing.TestFiles.GEONAMES_CSV;
+import static org.junit.jupiter.api.Assertions.*;
+
+import java.io.IOException;
+import java.util.List;
+import org.apache.baremaps.data.storage.*;
+import org.junit.jupiter.api.*;
+import org.locationtech.jts.geom.Point;
+
+class CsvDataTableGeonamesTest {
+
+  @Test
+  void testGeonamesCsvDataTable() throws IOException {
+    List<DataColumn> columns = List.of(
+        new DataColumnFixed("id", DataColumn.Cardinality.REQUIRED, 
DataColumn.Type.INTEGER),
+        new DataColumnFixed("name", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("asciiname", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("alternatenames", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("latitude", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.DOUBLE),
+        new DataColumnFixed("longitude", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.DOUBLE),
+        new DataColumnFixed("feature_class", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("feature_code", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("country_code", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("cc2", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin1_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin2_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin3_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin4_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("population", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.LONG),
+        new DataColumnFixed("elevation", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.INTEGER),
+        new DataColumnFixed("dem", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.INTEGER),
+        new DataColumnFixed("timezone", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("modification_date", 
DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING));
+    DataSchema schema = new DataSchemaImpl("geonames", columns);
+
+    boolean hasHeader = false;
+    char separator = '\t';
+    DataTable dataTable = new CsvDataTable(schema, GEONAMES_CSV.toFile(), 
hasHeader, separator);
+
+    assertEquals(5, dataTable.size(), "DataTable should have 5 rows.");
+
+    int rowCount = 0;
+    for (DataRow row : dataTable) {
+      rowCount++;
+
+      // Extract values
+      Integer id = (Integer) row.get("id");
+      String name = (String) row.get("name");
+      String asciiname = (String) row.get("asciiname");
+      String alternatenames = (String) row.get("alternatenames");
+      Double latitude = (Double) row.get("latitude");
+      Double longitude = (Double) row.get("longitude");
+      String featureClass = (String) row.get("feature_class");
+      String featureCode = (String) row.get("feature_code");
+      String countryCode = (String) row.get("country_code");
+      String cc2 = (String) row.get("cc2");
+      String admin1Code = (String) row.get("admin1_code");
+      String admin2Code = (String) row.get("admin2_code");
+      String admin3Code = (String) row.get("admin3_code");
+      String admin4Code = (String) row.get("admin4_code");
+      Long population = (Long) row.get("population");
+      Integer elevation = (Integer) row.get("elevation");

Review Comment:
   ## Unread local variable
   
   Variable 'Integer elevation' is never read.
   
   [Show more 
details](https://github.com/apache/incubator-baremaps/security/code-scanning/1598)



##########
baremaps-core/src/test/java/org/apache/baremaps/storage/csv/CsvDataTableGeonamesTest.java:
##########
@@ -0,0 +1,141 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.baremaps.storage.csv;
+
+import static org.apache.baremaps.testing.TestFiles.GEONAMES_CSV;
+import static org.junit.jupiter.api.Assertions.*;
+
+import java.io.IOException;
+import java.util.List;
+import org.apache.baremaps.data.storage.*;
+import org.junit.jupiter.api.*;
+import org.locationtech.jts.geom.Point;
+
+class CsvDataTableGeonamesTest {
+
+  @Test
+  void testGeonamesCsvDataTable() throws IOException {
+    List<DataColumn> columns = List.of(
+        new DataColumnFixed("id", DataColumn.Cardinality.REQUIRED, 
DataColumn.Type.INTEGER),
+        new DataColumnFixed("name", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("asciiname", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("alternatenames", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("latitude", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.DOUBLE),
+        new DataColumnFixed("longitude", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.DOUBLE),
+        new DataColumnFixed("feature_class", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("feature_code", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("country_code", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("cc2", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin1_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin2_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin3_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin4_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("population", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.LONG),
+        new DataColumnFixed("elevation", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.INTEGER),
+        new DataColumnFixed("dem", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.INTEGER),
+        new DataColumnFixed("timezone", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("modification_date", 
DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING));
+    DataSchema schema = new DataSchemaImpl("geonames", columns);
+
+    boolean hasHeader = false;
+    char separator = '\t';
+    DataTable dataTable = new CsvDataTable(schema, GEONAMES_CSV.toFile(), 
hasHeader, separator);
+
+    assertEquals(5, dataTable.size(), "DataTable should have 5 rows.");
+
+    int rowCount = 0;
+    for (DataRow row : dataTable) {
+      rowCount++;
+
+      // Extract values
+      Integer id = (Integer) row.get("id");
+      String name = (String) row.get("name");
+      String asciiname = (String) row.get("asciiname");
+      String alternatenames = (String) row.get("alternatenames");
+      Double latitude = (Double) row.get("latitude");
+      Double longitude = (Double) row.get("longitude");
+      String featureClass = (String) row.get("feature_class");
+      String featureCode = (String) row.get("feature_code");
+      String countryCode = (String) row.get("country_code");

Review Comment:
   ## Unread local variable
   
   Variable 'String countryCode' is never read.
   
   [Show more 
details](https://github.com/apache/incubator-baremaps/security/code-scanning/1591)



##########
baremaps-core/src/test/java/org/apache/baremaps/storage/csv/CsvDataTableGeonamesTest.java:
##########
@@ -0,0 +1,141 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.baremaps.storage.csv;
+
+import static org.apache.baremaps.testing.TestFiles.GEONAMES_CSV;
+import static org.junit.jupiter.api.Assertions.*;
+
+import java.io.IOException;
+import java.util.List;
+import org.apache.baremaps.data.storage.*;
+import org.junit.jupiter.api.*;
+import org.locationtech.jts.geom.Point;
+
+class CsvDataTableGeonamesTest {
+
+  @Test
+  void testGeonamesCsvDataTable() throws IOException {
+    List<DataColumn> columns = List.of(
+        new DataColumnFixed("id", DataColumn.Cardinality.REQUIRED, 
DataColumn.Type.INTEGER),
+        new DataColumnFixed("name", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("asciiname", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("alternatenames", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("latitude", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.DOUBLE),
+        new DataColumnFixed("longitude", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.DOUBLE),
+        new DataColumnFixed("feature_class", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("feature_code", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("country_code", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("cc2", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin1_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin2_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin3_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin4_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("population", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.LONG),
+        new DataColumnFixed("elevation", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.INTEGER),
+        new DataColumnFixed("dem", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.INTEGER),
+        new DataColumnFixed("timezone", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("modification_date", 
DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING));
+    DataSchema schema = new DataSchemaImpl("geonames", columns);
+
+    boolean hasHeader = false;
+    char separator = '\t';
+    DataTable dataTable = new CsvDataTable(schema, GEONAMES_CSV.toFile(), 
hasHeader, separator);
+
+    assertEquals(5, dataTable.size(), "DataTable should have 5 rows.");
+
+    int rowCount = 0;
+    for (DataRow row : dataTable) {
+      rowCount++;
+
+      // Extract values
+      Integer id = (Integer) row.get("id");
+      String name = (String) row.get("name");
+      String asciiname = (String) row.get("asciiname");
+      String alternatenames = (String) row.get("alternatenames");
+      Double latitude = (Double) row.get("latitude");
+      Double longitude = (Double) row.get("longitude");
+      String featureClass = (String) row.get("feature_class");
+      String featureCode = (String) row.get("feature_code");
+      String countryCode = (String) row.get("country_code");
+      String cc2 = (String) row.get("cc2");
+      String admin1Code = (String) row.get("admin1_code");
+      String admin2Code = (String) row.get("admin2_code");

Review Comment:
   ## Unread local variable
   
   Variable 'String admin2Code' is never read.
   
   [Show more 
details](https://github.com/apache/incubator-baremaps/security/code-scanning/1594)



##########
baremaps-core/src/test/java/org/apache/baremaps/storage/csv/CsvDataTableGeonamesTest.java:
##########
@@ -0,0 +1,141 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.baremaps.storage.csv;
+
+import static org.apache.baremaps.testing.TestFiles.GEONAMES_CSV;
+import static org.junit.jupiter.api.Assertions.*;
+
+import java.io.IOException;
+import java.util.List;
+import org.apache.baremaps.data.storage.*;
+import org.junit.jupiter.api.*;
+import org.locationtech.jts.geom.Point;
+
+class CsvDataTableGeonamesTest {
+
+  @Test
+  void testGeonamesCsvDataTable() throws IOException {
+    List<DataColumn> columns = List.of(
+        new DataColumnFixed("id", DataColumn.Cardinality.REQUIRED, 
DataColumn.Type.INTEGER),
+        new DataColumnFixed("name", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("asciiname", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("alternatenames", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("latitude", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.DOUBLE),
+        new DataColumnFixed("longitude", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.DOUBLE),
+        new DataColumnFixed("feature_class", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("feature_code", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("country_code", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("cc2", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin1_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin2_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin3_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin4_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("population", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.LONG),
+        new DataColumnFixed("elevation", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.INTEGER),
+        new DataColumnFixed("dem", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.INTEGER),
+        new DataColumnFixed("timezone", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("modification_date", 
DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING));
+    DataSchema schema = new DataSchemaImpl("geonames", columns);
+
+    boolean hasHeader = false;
+    char separator = '\t';
+    DataTable dataTable = new CsvDataTable(schema, GEONAMES_CSV.toFile(), 
hasHeader, separator);
+
+    assertEquals(5, dataTable.size(), "DataTable should have 5 rows.");
+
+    int rowCount = 0;
+    for (DataRow row : dataTable) {
+      rowCount++;
+
+      // Extract values
+      Integer id = (Integer) row.get("id");
+      String name = (String) row.get("name");
+      String asciiname = (String) row.get("asciiname");
+      String alternatenames = (String) row.get("alternatenames");
+      Double latitude = (Double) row.get("latitude");
+      Double longitude = (Double) row.get("longitude");
+      String featureClass = (String) row.get("feature_class");
+      String featureCode = (String) row.get("feature_code");
+      String countryCode = (String) row.get("country_code");
+      String cc2 = (String) row.get("cc2");
+      String admin1Code = (String) row.get("admin1_code");
+      String admin2Code = (String) row.get("admin2_code");
+      String admin3Code = (String) row.get("admin3_code");
+      String admin4Code = (String) row.get("admin4_code");
+      Long population = (Long) row.get("population");
+      Integer elevation = (Integer) row.get("elevation");
+      Integer dem = (Integer) row.get("dem");
+      String timezone = (String) row.get("timezone");
+      String modificationDate = (String) row.get("modification_date");

Review Comment:
   ## Unread local variable
   
   Variable 'String modificationDate' is never read.
   
   [Show more 
details](https://github.com/apache/incubator-baremaps/security/code-scanning/1601)



##########
baremaps-core/src/test/java/org/apache/baremaps/storage/csv/CsvDataTableGeonamesTest.java:
##########
@@ -0,0 +1,141 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.baremaps.storage.csv;
+
+import static org.apache.baremaps.testing.TestFiles.GEONAMES_CSV;
+import static org.junit.jupiter.api.Assertions.*;
+
+import java.io.IOException;
+import java.util.List;
+import org.apache.baremaps.data.storage.*;
+import org.junit.jupiter.api.*;
+import org.locationtech.jts.geom.Point;
+
+class CsvDataTableGeonamesTest {
+
+  @Test
+  void testGeonamesCsvDataTable() throws IOException {
+    List<DataColumn> columns = List.of(
+        new DataColumnFixed("id", DataColumn.Cardinality.REQUIRED, 
DataColumn.Type.INTEGER),
+        new DataColumnFixed("name", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("asciiname", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("alternatenames", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("latitude", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.DOUBLE),
+        new DataColumnFixed("longitude", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.DOUBLE),
+        new DataColumnFixed("feature_class", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("feature_code", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("country_code", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("cc2", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin1_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin2_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin3_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin4_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("population", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.LONG),
+        new DataColumnFixed("elevation", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.INTEGER),
+        new DataColumnFixed("dem", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.INTEGER),
+        new DataColumnFixed("timezone", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("modification_date", 
DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING));
+    DataSchema schema = new DataSchemaImpl("geonames", columns);
+
+    boolean hasHeader = false;
+    char separator = '\t';
+    DataTable dataTable = new CsvDataTable(schema, GEONAMES_CSV.toFile(), 
hasHeader, separator);
+
+    assertEquals(5, dataTable.size(), "DataTable should have 5 rows.");
+
+    int rowCount = 0;
+    for (DataRow row : dataTable) {
+      rowCount++;
+
+      // Extract values
+      Integer id = (Integer) row.get("id");
+      String name = (String) row.get("name");
+      String asciiname = (String) row.get("asciiname");
+      String alternatenames = (String) row.get("alternatenames");
+      Double latitude = (Double) row.get("latitude");
+      Double longitude = (Double) row.get("longitude");
+      String featureClass = (String) row.get("feature_class");
+      String featureCode = (String) row.get("feature_code");
+      String countryCode = (String) row.get("country_code");
+      String cc2 = (String) row.get("cc2");
+      String admin1Code = (String) row.get("admin1_code");
+      String admin2Code = (String) row.get("admin2_code");
+      String admin3Code = (String) row.get("admin3_code");
+      String admin4Code = (String) row.get("admin4_code");
+      Long population = (Long) row.get("population");
+      Integer elevation = (Integer) row.get("elevation");
+      Integer dem = (Integer) row.get("dem");
+      String timezone = (String) row.get("timezone");

Review Comment:
   ## Unread local variable
   
   Variable 'String timezone' is never read.
   
   [Show more 
details](https://github.com/apache/incubator-baremaps/security/code-scanning/1600)



##########
baremaps-core/src/test/java/org/apache/baremaps/storage/csv/CsvDataTableGeonamesTest.java:
##########
@@ -0,0 +1,141 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.baremaps.storage.csv;
+
+import static org.apache.baremaps.testing.TestFiles.GEONAMES_CSV;
+import static org.junit.jupiter.api.Assertions.*;
+
+import java.io.IOException;
+import java.util.List;
+import org.apache.baremaps.data.storage.*;
+import org.junit.jupiter.api.*;
+import org.locationtech.jts.geom.Point;
+
+class CsvDataTableGeonamesTest {
+
+  @Test
+  void testGeonamesCsvDataTable() throws IOException {
+    List<DataColumn> columns = List.of(
+        new DataColumnFixed("id", DataColumn.Cardinality.REQUIRED, 
DataColumn.Type.INTEGER),
+        new DataColumnFixed("name", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("asciiname", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("alternatenames", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("latitude", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.DOUBLE),
+        new DataColumnFixed("longitude", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.DOUBLE),
+        new DataColumnFixed("feature_class", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("feature_code", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("country_code", DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING),
+        new DataColumnFixed("cc2", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin1_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin2_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin3_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("admin4_code", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("population", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.LONG),
+        new DataColumnFixed("elevation", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.INTEGER),
+        new DataColumnFixed("dem", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.INTEGER),
+        new DataColumnFixed("timezone", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("modification_date", 
DataColumn.Cardinality.OPTIONAL,
+            DataColumn.Type.STRING));
+    DataSchema schema = new DataSchemaImpl("geonames", columns);
+
+    boolean hasHeader = false;
+    char separator = '\t';
+    DataTable dataTable = new CsvDataTable(schema, GEONAMES_CSV.toFile(), 
hasHeader, separator);
+
+    assertEquals(5, dataTable.size(), "DataTable should have 5 rows.");
+
+    int rowCount = 0;
+    for (DataRow row : dataTable) {
+      rowCount++;
+
+      // Extract values
+      Integer id = (Integer) row.get("id");
+      String name = (String) row.get("name");
+      String asciiname = (String) row.get("asciiname");
+      String alternatenames = (String) row.get("alternatenames");
+      Double latitude = (Double) row.get("latitude");
+      Double longitude = (Double) row.get("longitude");
+      String featureClass = (String) row.get("feature_class");
+      String featureCode = (String) row.get("feature_code");
+      String countryCode = (String) row.get("country_code");
+      String cc2 = (String) row.get("cc2");
+      String admin1Code = (String) row.get("admin1_code");
+      String admin2Code = (String) row.get("admin2_code");
+      String admin3Code = (String) row.get("admin3_code");

Review Comment:
   ## Unread local variable
   
   Variable 'String admin3Code' is never read.
   
   [Show more 
details](https://github.com/apache/incubator-baremaps/security/code-scanning/1595)



##########
baremaps-core/src/test/java/org/apache/baremaps/storage/csv/CsvDataTableTest.java:
##########
@@ -0,0 +1,192 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.baremaps.storage.csv;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.util.List;
+import org.apache.baremaps.data.storage.*;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.locationtech.jts.geom.Geometry;
+
+class CsvDataTableTest {
+
+  private File tempCsvFile;
+
+  @BeforeEach
+  void setUp() throws IOException {
+    tempCsvFile = File.createTempFile("test", ".csv");
+    tempCsvFile.deleteOnExit();
+  }
+
+  @AfterEach
+  void tearDown() {
+    if (tempCsvFile.exists()) {
+      tempCsvFile.delete();
+    }
+  }
+
+  @Test
+  void testCsvWithHeaderAndCommaSeparator() throws IOException {
+    String csvContent = """
+        id,name,geom
+        1,PointA,"POINT(1 1)"
+        2,PointB,"POINT(2 2)"
+        """;
+    Files.writeString(tempCsvFile.toPath(), csvContent);
+    List<DataColumn> columns = List.of(
+        new DataColumnFixed("id", DataColumn.Cardinality.REQUIRED, 
DataColumn.Type.INTEGER),
+        new DataColumnFixed("name", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("geom", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.GEOMETRY));
+    DataSchema schema = new DataSchemaImpl("test_table", columns);
+    DataTable dataTable = new CsvDataTable(schema, tempCsvFile, true, ',');
+    assertEquals(2, dataTable.size());
+    int rowCount = 0;
+    for (DataRow row : dataTable) {
+      rowCount++;
+      Integer id = (Integer) row.get("id");
+      String name = (String) row.get("name");
+      Geometry geometry = (Geometry) row.get("geom");
+      assertNotNull(id);
+      assertNotNull(name);
+      assertNotNull(geometry);
+      assertEquals("Point" + (rowCount == 1 ? "A" : "B"), name);
+      assertEquals("POINT (" + rowCount + " " + rowCount + ")", 
geometry.toText());
+    }
+    assertEquals(2, rowCount);
+  }
+
+  @Test
+  void testCsvWithoutHeaderAndSemicolonSeparator() throws IOException {
+    String csvContent = """
+        1;PointA;"POINT(1 1)"
+        2;PointB;"POINT(2 2)"
+        """;
+    Files.writeString(tempCsvFile.toPath(), csvContent);
+    List<DataColumn> columns = List.of(
+        new DataColumnFixed("column1", DataColumn.Cardinality.REQUIRED, 
DataColumn.Type.INTEGER),
+        new DataColumnFixed("column2", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING),
+        new DataColumnFixed("column3", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.GEOMETRY));
+    DataSchema schema = new DataSchemaImpl("test_table", columns);
+    DataTable dataTable = new CsvDataTable(schema, tempCsvFile, false, ';');
+    assertEquals(2, dataTable.size());
+    int rowCount = 0;
+    for (DataRow row : dataTable) {
+      rowCount++;
+      Integer id = (Integer) row.get("column1");
+      String name = (String) row.get("column2");
+      Geometry geometry = (Geometry) row.get("column3");
+
+      // Verify data
+      assertNotNull(id);
+      assertNotNull(name);
+      assertNotNull(geometry);
+
+      assertEquals("Point" + (rowCount == 1 ? "A" : "B"), name);
+      assertEquals("POINT (" + rowCount + " " + rowCount + ")", 
geometry.toText());
+    }
+    assertEquals(2, rowCount);
+  }
+
+  @Test
+  void testCsvWithDifferentDataTypes() throws IOException {
+    String csvContent = """
+        int_col,double_col,bool_col,string_col
+        1,1.1,true,Hello
+        2,2.2,false,World
+        """;
+    Files.writeString(tempCsvFile.toPath(), csvContent);
+    List<DataColumn> columns = List.of(
+        new DataColumnFixed("int_col", DataColumn.Cardinality.REQUIRED, 
DataColumn.Type.INTEGER),
+        new DataColumnFixed("double_col", DataColumn.Cardinality.REQUIRED, 
DataColumn.Type.DOUBLE),
+        new DataColumnFixed("bool_col", DataColumn.Cardinality.REQUIRED, 
DataColumn.Type.BOOLEAN),
+        new DataColumnFixed("string_col", DataColumn.Cardinality.REQUIRED, 
DataColumn.Type.STRING));
+    DataSchema schema = new DataSchemaImpl("test_table", columns);
+    DataTable dataTable = new CsvDataTable(schema, tempCsvFile, true, ',');
+    assertEquals(2, dataTable.size());
+    int rowCount = 0;
+    for (DataRow row : dataTable) {
+      rowCount++;
+      Integer intCol = (Integer) row.get("int_col");
+      Double doubleCol = (Double) row.get("double_col");
+      Boolean boolCol = (Boolean) row.get("bool_col");
+      String stringCol = (String) row.get("string_col");
+
+      // Verify data
+      assertEquals(rowCount, intCol);
+      assertEquals(rowCount * 1.1, doubleCol);
+      assertEquals(rowCount == 1, boolCol);
+      assertEquals(rowCount == 1 ? "Hello" : "World", stringCol);
+    }
+    assertEquals(2, rowCount);
+  }
+
+  @Test
+  void testCsvWithInvalidData() throws IOException {
+    String csvContent = """
+        id,name
+        abc,TestName
+        """;
+    Files.writeString(tempCsvFile.toPath(), csvContent);
+    List<DataColumn> columns = List.of(
+        new DataColumnFixed("id", DataColumn.Cardinality.REQUIRED, 
DataColumn.Type.INTEGER),
+        new DataColumnFixed("name", DataColumn.Cardinality.OPTIONAL, 
DataColumn.Type.STRING));
+    DataSchema schema = new DataSchemaImpl("test_table", columns);
+    DataTable dataTable = new CsvDataTable(schema, tempCsvFile, true, ',');
+    assertThrows(RuntimeException.class, () -> {
+      for (DataRow row : dataTable) {

Review Comment:
   ## Unread local variable
   
   Variable 'DataRow row' is never read.
   
   [Show more 
details](https://github.com/apache/incubator-baremaps/security/code-scanning/1602)



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to