clarified component name and content for FIND_FACTS_INDEXES: prefer db with compression;
authorwenzelm
Sun, 23 Feb 2025 21:22:41 +0100
changeset 82225 d3b401fe8188
parent 82224 979b63c3b4c1
child 82226 8e770d3cc85c
clarified component name and content for FIND_FACTS_INDEXES: prefer db with compression;
src/Doc/System/Presentation.thy
src/Pure/Admin/build_release.scala
src/Tools/Find_Facts/etc/settings
src/Tools/Find_Facts/src/find_facts.scala
--- a/src/Doc/System/Presentation.thy	Sun Feb 23 15:48:08 2025 +0100
+++ b/src/Doc/System/Presentation.thy	Sun Feb 23 21:22:41 2025 +0100
@@ -221,9 +221,9 @@
   the search index can be specified via system option 
   @{system_option find_facts_database_name}. A finished search index can be
   packed for later use as a regular Isabelle component using the 
-  @{tool_def find_facts_index_build} tool: Initializing such a component
-  causes it to be added to the list of managed components in
-  @{setting FIND_FACTS_INDEXES}.
+  @{tool_def find_facts_index_build} tool, with a \<^verbatim>\<open>.db\<close> file and
+  \<^verbatim>\<open>etc/settings\<close> to augment @{setting FIND_FACTS_INDEXES} for use by @{tool
+  find_facts_server}.
 
   \<^medskip>
   The user interface of the search is available as web application that 
--- a/src/Pure/Admin/build_release.scala	Sun Feb 23 15:48:08 2025 +0100
+++ b/src/Pure/Admin/build_release.scala	Sun Feb 23 21:22:41 2025 +0100
@@ -6,6 +6,8 @@
 
 package isabelle
 
+import isabelle.find_facts.Find_Facts
+
 
 object Build_Release {
   /** release context **/
@@ -496,9 +498,9 @@
           val database_dir =
             other_isabelle.expand_path(
               Path.explode("$FIND_FACTS_HOME_USER/solr") + Path.basic(database_name))
-          val database_target_dir =
+          val database_target =
             other_isabelle.expand_path(
-              Path.explode("$FIND_FACTS_HOME/lib/find_facts-" + database_name))
+              Path.explode("$FIND_FACTS_HOME/lib") + Path.basic(database_name).db)
 
           val sessions =
             other_isabelle.bash("bin/isabelle sessions -a " + opt_dirs).check.out_lines
@@ -506,8 +508,7 @@
             "bin/isabelle find_facts_index -o find_facts_database_name=" +
               Bash.string(database_name) + " -n -N " + opt_dirs +
               Bash.strings(sessions), echo = true).check
-          Isabelle_System.make_directory(database_target_dir)
-          Isabelle_System.copy_dir(database_dir, database_target_dir, direct = true)
+          Find_Facts.make_database(database_target, database_dir)
 
           Isabelle_System.rm_tree(database_dir)
           database_dir.dir.file.delete  // "$FIND_FACTS_HOME_USER/solr"
--- a/src/Tools/Find_Facts/etc/settings	Sun Feb 23 15:48:08 2025 +0100
+++ b/src/Tools/Find_Facts/etc/settings	Sun Feb 23 21:22:41 2025 +0100
@@ -3,8 +3,8 @@
 FIND_FACTS_HOME="$COMPONENT"
 FIND_FACTS_HOME_USER="$ISABELLE_HOME_USER/find_facts"
 
-if [ -d "$FIND_FACTS_HOME/lib/find_facts-isabelle" ]; then
-  FIND_FACTS_INDEXES="$FIND_FACTS_HOME/lib/find_facts-isabelle"
+if [ -f "$FIND_FACTS_HOME/lib/isabelle.db" ]; then
+  FIND_FACTS_INDEXES="$FIND_FACTS_HOME/lib/isabelle.db"
 else
   FIND_FACTS_INDEXES=""
 fi
--- a/src/Tools/Find_Facts/src/find_facts.scala	Sun Feb 23 15:48:08 2025 +0100
+++ b/src/Tools/Find_Facts/src/find_facts.scala	Sun Feb 23 21:22:41 2025 +0100
@@ -761,13 +761,23 @@
 
   /** index components **/
 
-  def resolve_indexes(solr: Solr.System): Unit =
-    for {
-      path <- Path.split(Isabelle_System.getenv("FIND_FACTS_INDEXES"))
-      database = Library.perhaps_unprefix("find_facts-", path.file_name)
-      database_dir = solr.database_dir(database)
-      if !database_dir.is_dir
-    } Isabelle_System.copy_dir(path, database_dir, direct = true)
+  def resolve_indexes(solr: Solr.System, progress: Progress = new Progress): Unit = {
+    val compress_cache = Compress.Cache.make()
+    for (path <- Path.split(Isabelle_System.getenv("FIND_FACTS_INDEXES"))) {
+      val database = path.drop_ext.file_name
+      val database_dir = solr.database_dir(database)
+      if (!database_dir.is_dir) {
+        progress.echo("Extracting " + path.expand)
+        Isabelle_System.make_directory(database_dir)
+        File_Store.database_extract(path, database_dir, compress_cache = compress_cache)
+      }
+    }
+  }
+
+  def make_database(database_path: Path, database_dir: Path): Unit =
+    File_Store.make_database(database_path, database_dir,
+      compress_options = Compress.Options_Zstd(level = 8),
+      compress_cache = Compress.Cache.make())
 
   def find_facts_index_build(
     database: String,
@@ -776,13 +786,15 @@
   ): Unit = {
     val solr = Solr.init(solr_data_dir)
 
-    val component = "find_facts-" + database
+    val component = "find_facts_" + database + "-" + Date.Format.alt_date(Date.now())
     val component_dir =
       Components.Directory(target_dir + Path.basic(component)).create(progress = progress)
 
-    Isabelle_System.copy_dir(solr.database_dir(database), component_dir.path)
+    val database_path = Path.basic(database).db
+    make_database(component_dir.path + database_path, solr.database_dir(database))
+
     component_dir.write_settings(
-      "\nFIND_FACTS_INDEXES=\"$FIND_FACTS_INDEXES:$COMPONENT/" + database + "\"")
+      "\nFIND_FACTS_INDEXES=\"$FIND_FACTS_INDEXES:$COMPONENT/" + database_path.implode + "\"")
   }
 
 
@@ -993,7 +1005,7 @@
     val web_assets = load_web_assets
 
     val solr = Solr.init(solr_data_dir)
-    resolve_indexes(solr)
+    resolve_indexes(solr, progress = progress)
 
     using(solr.open_database(database)) { db =>
       val stats = Find_Facts.query_stats(db, Query(Nil))