Changeset: a3cd1224c973 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/a3cd1224c973
Branch: default
Log Message:

Merge samloader branch into default branch.


diffs (truncated from 2033 to 300 lines):

diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml
--- a/.github/workflows/linux.yml
+++ b/.github/workflows/linux.yml
@@ -48,7 +48,7 @@ jobs:
       - name: install packages
         run: | 
           sudo apt-get update
-          sudo apt-get install -y bison libbz2-dev libpcre2-dev liblzma-dev 
liblz4-dev libxml2-dev pkg-config libxxhash-dev unixodbc-dev zlib1g-dev 
libssl-dev
+          sudo apt-get install -y bison libbz2-dev libpcre2-dev liblzma-dev 
liblz4-dev libxml2-dev pkg-config libxxhash-dev unixodbc-dev zlib1g-dev 
libssl-dev libhts-dev
         if: runner.os == 'Linux'
 
       - name: Patch /etc/hosts on Unix
@@ -74,7 +74,7 @@ jobs:
         if: runner.os == 'Linux'
 
       - name: brew packages
-        run: brew install bison pkgconf xxhash
+        run: brew install bison pkgconf xxhash htslib
         if: runner.os == 'macOS'
 
       - name: make MonetDB on macos
diff --git a/ChangeLog b/ChangeLog
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,21 @@
 # ChangeLog file for devel
 # This file is updated with Maddlog
 
+* Thu Oct 22 2026 Martin van Dinther <[email protected]>
+- Added support for reading DNA sequence alignment data from *.sam and *.bam 
files.
+  Usage examples:
+    SELECT * FROM '/path/to/file1.bam';
+  or
+    SELECT * FROM file_loader('/path/to/file1.bam');
+  Prerequisites:
+  We use the HTSlib for reading these files and the library needs to be
+  pre-installed on your OS (e.g. on Fedora via: sudo dnf install htslib).
+  See also: https://www.htslib.org/download/
+  The HTSlib must be version 1.24 or higher.
+  Also the MonetDB server has to be started with startup argument:
+   --loadmodule htslib
+  to enable it. By default it is not enabled.
+
 * Wed Oct 21 2026 Sjoerd Mullender <[email protected]>
 - There is a new type of database farm, like the --dbextra farm, for
   temporary heaps.  Temporary heaps are heaps which are created and
diff --git a/README.rst b/README.rst
--- a/README.rst
+++ b/README.rst
@@ -102,9 +102,9 @@ The following packages are optional but 
 ``readline-devel``, ``xz-devel``, ``zlib-devel``.
 
 The following packages are optional:
-``cfitsio-devel``, ``gdal-devel``, ``geos-devel``, ``libcmocka-devel``,
-``libcurl-devel``, ``libxml2-devel``, ``netcdf-devel``, ``proj-devel``,
-``unixODBC-devel``.
+``cfitsio-devel``, ``gdal-devel``, ``geos-devel``, ``htslib-devel``,
+``libcmocka-devel``, ``libcurl-devel``, ``libxml2-devel``,
+``netcdf-devel``, ``proj-devel``, ``unixODBC-devel``.
 
 On Ubuntu and Debian the following packages are required:
 ``bison``, ``cmake``, ``gcc``, ``pkg-config``, ``python3``,
@@ -116,8 +116,8 @@ The following packages are optional but 
 
 The following packages are optional:
 ``libcfitsio-dev``, ``libcmocka-dev``, ``libcurl4-gnutls-dev``,
-``libgdal-dev``, ``libgeos-dev``, ``libnetcdf-dev``, ``libproj-dev``,
-``libxml2-dev``, ``unixodbc-dev``.
+``libgdal-dev``, ``libgeos-dev``, ``libhts-dev``, ``libnetcdf-dev``,
+``libproj-dev``, ``libxml2-dev``, ``unixodbc-dev``.
 
 ``cmake`` must be at least version 3.12, ``python`` must be at least
 version 3.5.
diff --git a/cmake/Modules/FindHTSLIB.cmake b/cmake/Modules/FindHTSLIB.cmake
new file mode 100644
--- /dev/null
+++ b/cmake/Modules/FindHTSLIB.cmake
@@ -0,0 +1,47 @@
+# - Find htslib
+# Find the native htslib headers and libraries.
+#
+# HTSLIB_INCLUDE_DIRS  - where to find hts.h, etc.
+# HTSLIB_LIBRARIES     - List of libraries when using htslib.
+# HTSLIB_FOUND - True if htslib found.
+
+find_package(PkgConfig QUIET)
+pkg_check_modules(PC_HTSLIB QUIET htslib>=1.10)
+
+if(NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Darwin" OR PC_HTSLIB_FOUND)
+  if(NOT WIN32)
+
+    # Look for the header file.
+    find_path(HTSLIB_INCLUDE_DIR NAMES htslib/hts.h
+      HINTS
+      ${PC_HTSLIB_INCLUDEDIR}
+      ${PC_HTSLIB_INCLUDE_DIRS}
+      PATH_SUFFIXES htslib
+      )
+
+    # Look for the library.
+    find_library(HTSLIB_LIBRARIES NAMES hts
+      HINTS
+      ${PC_HTSLIB_LIBDIR}
+      ${PC_HTSLIB_LIBRARY_DIRS}
+      )
+
+  endif()
+endif()
+
+# Handle the QUIETLY and REQUIRED arguments and set HTSLIB_FOUND to TRUE if 
all listed variables are TRUE.
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(HTSLIB DEFAULT_MSG HTSLIB_LIBRARIES 
HTSLIB_INCLUDE_DIR)
+
+mark_as_advanced(HTSLIB_INCLUDE_DIR HTSLIB_LIBRARIES)
+
+if(HTSLIB_FOUND)
+  add_library(HTSLIB::HTSLIB UNKNOWN IMPORTED)
+  set_target_properties(HTSLIB::HTSLIB
+    PROPERTIES
+    INTERFACE_INCLUDE_DIRECTORIES "${HTSLIB_INCLUDE_DIR}")
+  set_target_properties(HTSLIB::HTSLIB
+    PROPERTIES
+    IMPORTED_LINK_INTERFACE_LANGUAGES "C"
+    IMPORTED_LOCATION "${HTSLIB_LIBRARIES}")
+endif()
diff --git a/cmake/monetdb-defines.cmake b/cmake/monetdb-defines.cmake
--- a/cmake/monetdb-defines.cmake
+++ b/cmake/monetdb-defines.cmake
@@ -151,6 +151,7 @@ macro(monetdb_macro_variables)
   set(SANITIZER ${SANITIZER})
   set(HAVE_RTREE ${RTREE_FOUND})
   set(HAVE_OPENSSL ${OPENSSL_FOUND})
+  set(HAVE_HTSLIB ${HTSLIB_FOUND})
 
   set(BUILD_TYPE "${CMAKE_BUILD_TYPE}")
   if(CMAKE_BUILD_TYPE)
diff --git a/cmake/monetdb-findpackages.cmake b/cmake/monetdb-findpackages.cmake
--- a/cmake/monetdb-findpackages.cmake
+++ b/cmake/monetdb-findpackages.cmake
@@ -138,6 +138,10 @@ if(WITH_OPENSSL)
   find_package(OpenSSL 1.1.1)
 endif()
 
+if(WITH_HTSLIB)
+  find_package(HTSLIB)
+endif()
+
 find_package(Sphinx)
 find_package(Semodule)
 find_package(Awk)
diff --git a/cmake/monetdb-functions.cmake b/cmake/monetdb-functions.cmake
--- a/cmake/monetdb-functions.cmake
+++ b/cmake/monetdb-functions.cmake
@@ -81,6 +81,7 @@ function(monetdb_cmake_summary)
     message(STATUS "Linux distro: ${LINUX_DISTRO}")
     message(STATUS "Linux distro version: ${LINUX_DISTRO_VERSION}")
   endif()
+  message(STATUS "hts library: ${HTSLIB_FOUND}")
   message(STATUS "Iconv library: ${Iconv_FOUND}")
   message(STATUS "Pthread library: ${CMAKE_USE_PTHREADS_INIT}")
   message(STATUS "Pcre library: ${PCRE_FOUND}")
diff --git a/cmake/monetdb-options.cmake b/cmake/monetdb-options.cmake
--- a/cmake/monetdb-options.cmake
+++ b/cmake/monetdb-options.cmake
@@ -149,6 +149,10 @@ option(WITH_OPENSSL
   "Include TLS support"
   ON)
 
+option(WITH_HTSLIB
+  "Include htslib support"
+  ON)
+
 option(CMAKE_SUMMARY
   "Show a summary of the cmake configuration (for debug purposes)"
   OFF)
diff --git a/monetdb_config.h.in b/monetdb_config.h.in
--- a/monetdb_config.h.in
+++ b/monetdb_config.h.in
@@ -369,6 +369,7 @@
 #cmakedefine HAVE_LIBZ 1
 #cmakedefine HAVE_NETCDF 1
 #cmakedefine HAVE_OPENSSL 1
+#cmakedefine HAVE_HTSLIB 1
 #cmakedefine HAVE_PROJ 1
 #cmakedefine HAVE_READLINE 1
 #cmakedefine HAVE_RTREE 1
diff --git a/sql/backends/monet5/vaults/CMakeLists.txt 
b/sql/backends/monet5/vaults/CMakeLists.txt
--- a/sql/backends/monet5/vaults/CMakeLists.txt
+++ b/sql/backends/monet5/vaults/CMakeLists.txt
@@ -13,6 +13,7 @@ add_subdirectory(netcdf)
 add_subdirectory(shp)
 add_subdirectory(csv)
 add_subdirectory(parquet)
+add_subdirectory(sambam)
 add_subdirectory(monetdb)
 add_subdirectory(odbc)
 
diff --git a/sql/backends/monet5/vaults/sambam/CMakeLists.txt 
b/sql/backends/monet5/vaults/sambam/CMakeLists.txt
new file mode 100644
--- /dev/null
+++ b/sql/backends/monet5/vaults/sambam/CMakeLists.txt
@@ -0,0 +1,60 @@
+#[[
+# SPDX-License-Identifier: MPL-2.0
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0.  If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+#
+# For copyright information, see the file debian/copyright.
+#]]
+
+if(HAVE_HTSLIB)
+  add_library(htslib MODULE)
+
+  target_sources(htslib
+    PRIVATE
+    sambam.c)
+
+  target_include_directories(htslib
+    PRIVATE
+    $<$<BOOL:${HTSLIB_FOUND}>:${HTSLIB_INCLUDE_DIRS}>
+    $<TARGET_PROPERTY:mal,INTERFACE_INCLUDE_DIRECTORIES>
+    $<TARGET_PROPERTY:malmodules,INTERFACE_INCLUDE_DIRECTORIES>
+    $<TARGET_PROPERTY:atoms,INTERFACE_INCLUDE_DIRECTORIES>
+    $<TARGET_PROPERTY:sql,INTERFACE_INCLUDE_DIRECTORIES>
+    $<TARGET_PROPERTY:sqlcommon,INTERFACE_INCLUDE_DIRECTORIES>
+    $<TARGET_PROPERTY:sqlserver,INTERFACE_INCLUDE_DIRECTORIES>
+    $<TARGET_PROPERTY:sqlstorage,INTERFACE_INCLUDE_DIRECTORIES>
+    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
+    $<INSTALL_INTERFACE:${INCLUDEDIR}/monetdb>)
+
+  set_target_properties(htslib
+    PROPERTIES
+    NO_SONAME ON
+    OUTPUT_NAME
+    _htslib)
+
+  target_compile_definitions(htslib
+    PRIVATE
+    LIBHTSLIB)
+
+  target_link_libraries(htslib
+    PRIVATE
+    monetdb_config_header
+    bat
+    monetdb5
+    sqlinclude
+    HTSLIB::HTSLIB)
+
+  install(TARGETS htslib
+    DESTINATION ${CMAKE_INSTALL_LIBDIR}/monetdb5-${MONETDB_VERSION}
+    COMPONENT htslib)
+
+  if(WIN32)
+    install(FILES
+      $<TARGET_PDB_FILE:htslib>
+      DESTINATION ${CMAKE_INSTALL_LIBDIR}/monetdb5-${MONETDB_VERSION}
+      OPTIONAL)
+  endif()
+endif()
+
diff --git a/sql/backends/monet5/vaults/sambam/sambam.c 
b/sql/backends/monet5/vaults/sambam/sambam.c
new file mode 100644
--- /dev/null
+++ b/sql/backends/monet5/vaults/sambam/sambam.c
@@ -0,0 +1,554 @@
+/*
+ * SPDX-License-Identifier: MPL-2.0
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0.  If a copy of the MPL was not distributed with this
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/.
+ *
+ * For copyright information, see the file debian/copyright.
+ */
+
+/*
+ * This file contains a reader of aligmnent data from *.sam and *.bam files
+ * and load the alignment data into a transient MonetDB table consisting of 12 
columns.
+ * SAM stands for Sequence Alignment Map. Ref: 
https://en.wikipedia.org/wiki/SAM_(file_format)
+ * BAM stands for Binary Alignment Map.   Ref: 
https://en.wikipedia.org/wiki/BAM_(file_format)
+ * BAM is the compressed binary representation of SAM (Sequence Alignment Map).
+ * BAM is one of the most common file formats for raw genome sequencing data.
+ *
+ * A SAM file is a TAB-delimited text format consisting of a header section, 
which is optional,
+ * and an alignment section. If present, the header must be prior to the 
alignments.
+ * Header lines start with ‘@’, while alignment lines do not.
+ * Each alignment line has 11 mandatory fields for essential alignment 
information
+ * such as mapping position, and variable number of optional fields for 
flexible
+ * or aligner specific information.
+ * Ref: https://samtools.github.io/hts-specs/SAMv1.pdf
+ *
+ * We use the htslib library for reading data from these files.
+ * Ref: https://github.com/samtools/htslib  and  https://www.htslib.org/
+ * To install this library and its include files on Fedora, do: sudo dnf 
install htslib-devel
+ *
+ * Limitations:
+ * - Only the alignment data is read and converted into bats, not the
+ *   header information as it has a different table format.
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to