src/Tools/Find_Facts/src/find_facts.scala
author Fabian Huch <huch@in.tum.de>
Wed, 22 Jan 2025 10:35:17 +0100
changeset 81895 9d1003cb9844
parent 81894 dffa88c87a08
child 81897 794591b2ea97
permissions -rw-r--r--
copy instead of symlink managed Find_Facts indexes: portable, and allows updating with local sessions;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
81775
1a02f32f7d20 tuned headers;
wenzelm
parents: 81772
diff changeset
     1
/*  Title:      Tools/Find_Facts/src/find_facts.scala
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
     2
    Author:     Fabian Huch, TU Muenchen
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
     3
81775
1a02f32f7d20 tuned headers;
wenzelm
parents: 81772
diff changeset
     4
Full-text search engine for Isabelle (including web server), using Apache Solr
1a02f32f7d20 tuned headers;
wenzelm
parents: 81772
diff changeset
     5
https://solr.apache.org as backend.
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
     6
*/
81770
f54881ce5cf3 proper component src/Tools/Find_Facts;
wenzelm
parents: 81764
diff changeset
     7
f54881ce5cf3 proper component src/Tools/Find_Facts;
wenzelm
parents: 81764
diff changeset
     8
package isabelle.find_facts
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
     9
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    10
81770
f54881ce5cf3 proper component src/Tools/Find_Facts;
wenzelm
parents: 81764
diff changeset
    11
import isabelle._
f54881ce5cf3 proper component src/Tools/Find_Facts;
wenzelm
parents: 81764
diff changeset
    12
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    13
import scala.annotation.tailrec
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    14
import scala.collection.immutable.TreeMap
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    15
import scala.collection.mutable
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    16
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    17
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    18
object Find_Facts {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    19
  /** blocks **/
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    20
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    21
  object Kind {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    22
    val CONST = "constant"
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    23
    val TYPE = "type"
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    24
    val THM = "fact"
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    25
  }
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    26
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    27
  case class Block(
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    28
    id: String,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    29
    version: Long,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    30
    chapter: String,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    31
    session: String,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    32
    theory: String,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    33
    file: String,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    34
    url_path: Path,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    35
    command: String,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    36
    start_line: Int,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    37
    src_before: String,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    38
    src: String,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    39
    src_after: String,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    40
    xml: XML.Body,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    41
    html: String,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    42
    entity_kname: Option[String],
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    43
    consts: List[String],
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    44
    typs: List[String],
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    45
    thms: List[String]
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    46
  ) {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    47
    def path = Path.explode(file)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    48
    def file_type: String = path.get_ext
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    49
    def file_name: String = path.file_name
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    50
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    51
    def kinds: List[String] =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    52
      (if (typs.nonEmpty) List(Kind.TYPE) else Nil) :::
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    53
      (if (consts.nonEmpty) List(Kind.CONST) else Nil) :::
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    54
      (if (thms.nonEmpty) List(Kind.THM) else Nil)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    55
    def names: List[String] = (typs ::: consts ::: thms).distinct
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    56
  }
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    57
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    58
  case class Blocks(num_found: Long, blocks: List[Block], cursor: String)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    59
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    60
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    61
  /** queries */
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    62
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    63
  enum Atom {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    64
    case Exact(s: String) extends Atom
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    65
    case Value(s: String) extends Atom
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    66
  }
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    67
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    68
  enum Field {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    69
    case chapter, session, file_type, theory, command, source, names, consts, typs, thms, kinds
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    70
  }
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    71
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    72
  sealed trait Filter
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    73
  case class Field_Filter(field: Field, either: List[Atom]) extends Filter
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    74
  case class Any_Filter(either: List[Atom]) extends Filter {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    75
    def fields: List[Field] = List(Field.session, Field.theory, Field.source, Field.names)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    76
  }
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    77
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    78
  case class Select(field: Field, values: List[String])
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    79
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    80
  object Query {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    81
    def apply(filters: Filter*): Query = new Query(filters.toList)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    82
  }
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    83
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    84
  case class Query(
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    85
    filters: List[Filter] = Nil,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    86
    exclude: List[Filter] = Nil,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    87
    selects: List[Select] = Nil)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    88
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    89
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    90
  /* stats and facets */
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    91
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    92
  case class Stats(
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    93
    results: Long,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    94
    sessions: Long,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    95
    theories: Long,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    96
    commands: Long,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    97
    consts: Long,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    98
    typs: Long,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
    99
    thms: Long)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   100
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   101
  case class Facets(
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   102
    chapter: Map[String, Long],
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   103
    session: Map[String, Long],
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   104
    theory: Map[String, Long],
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   105
    file_type: Map[String, Long],
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   106
    command: Map[String, Long],
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   107
    kinds: Map[String, Long],
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   108
    consts: Map[String, Long],
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   109
    typs: Map[String, Long],
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   110
    thms: Map[String, Long])
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   111
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   112
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   113
  /** Solr data model **/
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   114
81890
234bac3f2730 clarified settings: $FIND_FACTS_HOME_USER instead of individual directories;
Fabian Huch <huch@in.tum.de>
parents: 81889
diff changeset
   115
  val solr_data_dir: Path = Path.explode("$FIND_FACTS_HOME_USER/solr")
81888
6f86f2751a7b clarified: application-specific $SOLR_DATA, e.g. $FIND_FACTS_SOLR_DATA;
Fabian Huch <huch@in.tum.de>
parents: 81881
diff changeset
   116
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   117
  object private_data extends Solr.Data("find_facts") {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   118
    /* types */
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   119
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   120
    val symbol_codes =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   121
      for {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   122
        entry <- Symbol.symbols.entries
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   123
        code <- entry.decode.toList
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   124
        input <- entry.symbol :: entry.abbrevs
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   125
      } yield input -> code
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   126
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   127
    val replacements =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   128
      for ((symbol, codes) <- symbol_codes.groupMap(_._1)(_._2).toList if codes.length == 1)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   129
      yield symbol -> Library.the_single(codes)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   130
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   131
    val Special_Char = """(.*[(){}\[\].,:"].*)""".r
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   132
    val Arrow = """(.*=>.*)""".r
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   133
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   134
    val synonyms =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   135
      for {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   136
        (symbol, code) <- symbol_codes
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   137
        if !Special_Char.matches(symbol) && !Arrow.matches(symbol)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   138
      } yield symbol + " => " + code
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   139
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   140
    override lazy val more_config = Map(Path.basic("synonyms.txt") -> synonyms.mkString("\n"))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   141
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   142
    object Types {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   143
      private val strip_html = Solr.Class("charFilter", "HTMLStripCharFilterFactory")
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   144
      private val replace_symbol_chars =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   145
        replacements.collect {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   146
          case (Special_Char(pattern), code) =>
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   147
            Solr.Class(
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   148
              "charFilter", "PatternReplaceCharFilterFactory",
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   149
              List("pattern" -> ("\\Q" + pattern + "\\E"), "replacement" -> code))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   150
        }
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   151
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   152
      private val symbol_pattern =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   153
         """\s*(::|[(){}\[\].,:"]|[^\p{ASCII}]|((?![^\p{ASCII}])[^(){}\[\].,:"\s])+)\s*""".r
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   154
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   155
      private val tokenize =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   156
        Solr.Class("tokenizer", "WhitespaceTokenizerFactory", List("rule" -> "java"))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   157
      private val tokenize_symbols =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   158
        Solr.Class("tokenizer", "PatternTokenizerFactory",
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   159
          List("pattern" -> symbol_pattern.toString, "group" -> "1"))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   160
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   161
      private val to_lower = Solr.Class("filter", "LowerCaseFilterFactory")
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   162
      private val add_ascii =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   163
        Solr.Class("filter", "ASCIIFoldingFilterFactory", List("preserveOriginal" -> "true"))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   164
      private val delimit_words =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   165
        Solr.Class("filter", "WordDelimiterGraphFilterFactory", List(
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   166
          "splitOnCaseChange" -> "0", "stemEnglishPossessive" -> "0", "preserveOriginal" -> "1"))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   167
      private val flatten = Solr.Class("filter", "FlattenGraphFilterFactory")
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   168
      private val replace_symbols =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   169
        Solr.Class("filter", "SynonymGraphFilterFactory", List("synonyms" -> "synonyms.txt"))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   170
      private val replace_special_symbols =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   171
        replacements.collect {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   172
          case (Arrow(arrow), code) =>
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   173
            Solr.Class("filter", "PatternReplaceFilterFactory",
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   174
              List("pattern" -> ("\\Q" + arrow + "\\E"), "replacement" -> code))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   175
        }
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   176
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   177
      val source =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   178
        Solr.Type("name", "TextField", Nil, List(
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   179
          XML.Elem(Markup("analyzer", List("type" -> "index")),
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   180
            List(strip_html, tokenize_symbols, to_lower, add_ascii, delimit_words, flatten)),
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   181
          XML.Elem(
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   182
            Markup("analyzer", List("type" -> "query")),
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   183
              replace_symbol_chars ::: tokenize_symbols :: replace_symbols ::
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   184
                replace_special_symbols ::: to_lower :: Nil)))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   185
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   186
      val name =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   187
        Solr.Type("source", "TextField", Nil, List(
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   188
          XML.Elem(Markup("analyzer", List("type" -> "index")),
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   189
            List(tokenize, to_lower, delimit_words, flatten)),
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   190
          XML.Elem(Markup("analyzer", List("type" -> "query")), List(tokenize, to_lower))))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   191
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   192
      val text = Solr.Type("text", "TextField")
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   193
    }
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   194
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   195
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   196
    /* fields */
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   197
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   198
    object Fields {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   199
      val id = Solr.Field("id", Solr.Type.string).make_unique_key
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   200
      val version = Solr.Field("version", Solr.Type.long, Solr.Column_Wise(true))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   201
      val chapter = Solr.Field("chapter", Solr.Type.string, Solr.Column_Wise(true))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   202
      val session = Solr.Field("session", Types.name)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   203
      val session_facet = Solr.Field("session_facet", Solr.Type.string, Solr.Stored(false))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   204
      val theory = Solr.Field("theory", Types.name)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   205
      val theory_facet = Solr.Field("theory_facet", Solr.Type.string, Solr.Stored(false))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   206
      val file = Solr.Field("file", Solr.Type.string, Solr.Indexed(false))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   207
      val file_type =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   208
        Solr.Field("file_type", Solr.Type.string, Solr.Column_Wise(true) ::: Solr.Stored(false))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   209
      val url_path = Solr.Field("url_path", Solr.Type.string, Solr.Indexed(false))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   210
      val command = Solr.Field("command", Solr.Type.string, Solr.Column_Wise(true))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   211
      val start_line = Solr.Field("start_line", Solr.Type.int, Solr.Column_Wise(true))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   212
      val src_before = Solr.Field("src_before", Solr.Type.string, Solr.Indexed(false))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   213
      val src_after = Solr.Field("src_after", Solr.Type.string, Solr.Indexed(false))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   214
      val src = Solr.Field("src", Types.source)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   215
      val xml = Solr.Field("xml", Solr.Type.bytes, Solr.Indexed(false))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   216
      val html = Solr.Field("html", Solr.Type.bytes, Solr.Indexed(false))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   217
      val entity_kname = Solr.Field("entity_kname", Solr.Type.string, Solr.Indexed(false))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   218
      val consts = Solr.Field("consts", Types.name, Solr.Multi_Valued(true))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   219
      val consts_facet =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   220
        Solr.Field("consts_facet", Solr.Type.string, Solr.Multi_Valued(true) ::: Solr.Stored(false))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   221
      val typs = Solr.Field("typs", Types.name, Solr.Multi_Valued(true))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   222
      val typs_facet =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   223
        Solr.Field("typs_facet", Solr.Type.string, Solr.Multi_Valued(true) ::: Solr.Stored(false))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   224
      val thms = Solr.Field("thms", Types.name, Solr.Multi_Valued(true))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   225
      val thms_facet =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   226
        Solr.Field("thms_facet", Solr.Type.string, Solr.Multi_Valued(true) ::: Solr.Stored(false))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   227
      val names = Solr.Field("names", Types.name, Solr.Multi_Valued(true) ::: Solr.Stored(false))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   228
      val kinds =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   229
        Solr.Field("kinds", Solr.Type.string,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   230
          Solr.Multi_Valued(true) ::: Solr.Column_Wise(true) ::: Solr.Stored(false))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   231
    }
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   232
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   233
    lazy val fields: Solr.Fields = Solr.Fields(
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   234
      Fields.id, Fields.version, Fields.chapter, Fields.session, Fields.session_facet,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   235
      Fields.theory, Fields.theory_facet, Fields.file, Fields.file_type, Fields.url_path,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   236
      Fields.command, Fields.start_line, Fields.src_before, Fields.src_after, Fields.src,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   237
      Fields.xml, Fields.html, Fields.entity_kname, Fields.consts, Fields.consts_facet, Fields.typs,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   238
      Fields.typs_facet, Fields.thms, Fields.thms_facet, Fields.names, Fields.kinds)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   239
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   240
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   241
    /* operations */
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   242
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   243
    def read_domain(db: Solr.Database, q: Solr.Source): Set[String] =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   244
      db.execute_query(Fields.id, List(Fields.id), None, 100000,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   245
        { results =>
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   246
          results.map(_.string(Fields.id)).toSet
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   247
        }, q = q)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   248
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   249
    def read_block(res: Solr.Result): Block = {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   250
      val id = res.string(Fields.id)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   251
      val version = res.long(Fields.version)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   252
      val chapter = res.string(Fields.chapter)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   253
      val session = res.string(Fields.session)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   254
      val theory = res.string(Fields.theory)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   255
      val file = res.string(Fields.file)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   256
      val url_path = Path.explode(res.string(Fields.url_path))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   257
      val command = res.string(Fields.command)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   258
      val start_line = res.int(Fields.start_line)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   259
      val src_before = res.string(Fields.src_before)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   260
      val src = res.string(Fields.src)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   261
      val src_after = res.string(Fields.src_after)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   262
      val xml = YXML.parse_body(res.bytes(Fields.xml))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   263
      val html = res.bytes(Fields.html).text
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   264
      val entity_kname = res.get_string(Fields.entity_kname)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   265
      val consts = res.list_string(Fields.consts)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   266
      val typs = res.list_string(Fields.typs)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   267
      val thms = res.list_string(Fields.thms)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   268
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   269
      Block(id = id, version = version, chapter = chapter, session = session, theory = theory,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   270
        file = file, url_path = url_path, command = command, start_line = start_line, src_before =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   271
        src_before, src = src, src_after = src_after, xml = xml, html = html, entity_kname =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   272
        entity_kname, consts = consts, typs = typs, thms = thms)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   273
    }
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   274
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   275
    def read_blocks(
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   276
      db: Solr.Database,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   277
      q: Solr.Source,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   278
      fq: List[Solr.Source],
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   279
      cursor: Option[String] = None,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   280
      max_results: Int = 10
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   281
    ): Blocks =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   282
      db.execute_query(Fields.id, stored_fields, cursor, max_results,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   283
        { results =>
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   284
          val next_cursor = results.next_cursor
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   285
          val blocks = results.map(read_block).toList
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   286
          Blocks(results.num_found, blocks, next_cursor)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   287
        }, q = q, fq = fq, more_chunks = 0)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   288
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   289
    def stream_blocks(
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   290
      db: Solr.Database,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   291
      q: Solr.Source,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   292
      stream: Iterator[Block] => Unit,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   293
      cursor: Option[String] = None,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   294
    ): Unit =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   295
      db.execute_query(Fields.id, stored_fields, cursor, 10000,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   296
        { results =>
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   297
          stream(results.map(read_block))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   298
        }, q = q)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   299
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   300
    def update_theory(db: Solr.Database, theory_name: String, blocks: List[Block]): Unit =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   301
      db.transaction {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   302
        val delete =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   303
          read_domain(db, Solr.filter(Fields.theory, Solr.phrase(theory_name))) -- blocks.map(_.id)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   304
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   305
        if (delete.nonEmpty) db.execute_batch_delete(delete.toList)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   306
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   307
        db.execute_batch_insert(
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   308
          for (block <- blocks) yield { (doc: Solr.Document) =>
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   309
            doc.string(Fields.id) = block.id
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   310
            doc.long(Fields.version) = block.version
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   311
            doc.string(Fields.chapter) = block.chapter
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   312
            doc.string(Fields.session) = block.session
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   313
            doc.string(Fields.session_facet) = block.session
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   314
            doc.string(Fields.theory) = block.theory
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   315
            doc.string(Fields.theory_facet) = block.theory
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   316
            doc.string(Fields.file) = block.file
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   317
            doc.string(Fields.file_type) = block.file_type
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   318
            doc.string(Fields.url_path) = block.url_path.implode
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   319
            doc.string(Fields.command) = block.command
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   320
            doc.int(Fields.start_line) = block.start_line
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   321
            doc.string(Fields.src_before) = block.src_before
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   322
            doc.string(Fields.src) = block.src
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   323
            doc.string(Fields.src_after) = block.src_after
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   324
            doc.bytes(Fields.xml) = YXML.bytes_of_body(block.xml)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   325
            doc.bytes(Fields.html) = Bytes(block.html)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   326
            doc.string(Fields.entity_kname) = block.entity_kname
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   327
            doc.string(Fields.consts) = block.consts
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   328
            doc.string(Fields.consts_facet) = block.consts
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   329
            doc.string(Fields.typs) = block.typs
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   330
            doc.string(Fields.typs_facet) = block.typs
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   331
            doc.string(Fields.thms) = block.thms
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   332
            doc.string(Fields.thms_facet) = block.thms
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   333
            doc.string(Fields.names) = block.names
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   334
            doc.string(Fields.kinds) = block.kinds
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   335
          })
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   336
      }
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   337
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   338
    def read_theory(db: Solr.Database, theory_name: String): List[Block] = {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   339
      val blocks = new mutable.ListBuffer[Block]
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   340
      stream_blocks(db, Solr.filter(Fields.theory_facet, Solr.phrase(theory_name)), {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   341
        res => blocks ++= res
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   342
      })
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   343
      blocks.toList
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   344
    }
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   345
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   346
    def delete_session(db: Solr.Database, session_name: String): Unit =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   347
      db.transaction {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   348
        val delete = read_domain(db, Solr.filter(Fields.session, Solr.phrase(session_name)))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   349
        if (delete.nonEmpty) db.execute_batch_delete(delete.toList)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   350
      }
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   351
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   352
    def query_stats(db: Solr.Database, q: Solr.Source, fq: List[Solr.Source]): Stats =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   353
      db.execute_stats_query(
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   354
        List(Fields.session_facet, Fields.theory_facet, Fields.command, Fields.consts_facet,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   355
          Fields.typs_facet, Fields.thms_facet, Fields.start_line),
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   356
        { res =>
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   357
          val results = res.count
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   358
          val sessions = res.count(Fields.session_facet)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   359
          val theories = res.count(Fields.theory_facet)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   360
          val commands = res.count(Fields.theory_facet)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   361
          val consts = res.count(Fields.consts_facet)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   362
          val typs = res.count(Fields.typs_facet)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   363
          val thms = res.count(Fields.thms_facet)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   364
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   365
          Stats(results, sessions, theories, commands, consts, typs, thms)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   366
        }, q = q, fq = fq)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   367
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   368
    def query_facets(
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   369
      db: Solr.Database,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   370
      q: Solr.Source,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   371
      fq: List[Solr.Source],
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   372
      max_terms: Int = 100
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   373
    ): Facets =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   374
      db.execute_facet_query(
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   375
        List(Fields.chapter, Fields.session_facet, Fields.theory_facet, Fields.file_type,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   376
          Fields.command, Fields.kinds, Fields.consts_facet, Fields.typs_facet, Fields.thms_facet),
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   377
        { res =>
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   378
          val chapter = res.string(Fields.chapter)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   379
          val sessions = res.string(Fields.session_facet)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   380
          val theories = res.string(Fields.theory_facet)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   381
          val file_types = res.string(Fields.file_type)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   382
          val commands = res.string(Fields.command)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   383
          val kinds = res.string(Fields.kinds)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   384
          val consts = res.string(Fields.consts_facet)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   385
          val typs = res.string(Fields.typs_facet)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   386
          val thms = res.string(Fields.thms_facet)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   387
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   388
          Facets(chapter, sessions, theories, file_types, commands, kinds, consts, typs, thms)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   389
        }, q = q, fq = fq, max_terms = max_terms)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   390
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   391
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   392
    /* queries */
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   393
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   394
    def solr_field(field: Field, select: Boolean = false): Solr.Field =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   395
      field match {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   396
        case Field.chapter => Fields.chapter
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   397
        case Field.session if select => Fields.session_facet
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   398
        case Field.session => Fields.session
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   399
        case Field.theory if select => Fields.theory_facet
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   400
        case Field.theory => Fields.theory
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   401
        case Field.file_type => Fields.file_type
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   402
        case Field.command => Fields.command
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   403
        case Field.source => Fields.src
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   404
        case Field.names => Fields.names
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   405
        case Field.consts if select => Fields.consts_facet
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   406
        case Field.consts => Fields.consts
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   407
        case Field.typs if select => Fields.typs_facet
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   408
        case Field.typs => Fields.typs
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   409
        case Field.thms if select => Fields.thms_facet
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   410
        case Field.thms => Fields.thms
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   411
        case Field.kinds => Fields.kinds
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   412
      }
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   413
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   414
    def solr_query(query: Query): (Solr.Source, List[Solr.Source]) = {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   415
      def solr_atom(atom: Atom): List[Solr.Source] =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   416
        atom match {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   417
          case Atom.Value(s) if s.isEmpty => Nil
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   418
          case Atom.Value(s) if !s.exists(Solr.wildcard_char(_)) => List(Solr.term(s))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   419
          case Atom.Value(s) =>
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   420
            val terms = s.split("\\s+").toList.filterNot(_.isBlank)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   421
            if (terms.isEmpty) Nil else terms.map(Solr.wildcard)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   422
          case Atom.Exact(s) => List(Solr.phrase(s))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   423
        }
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   424
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   425
      def solr_atoms(field: Field, atoms: List[Atom]): List[Solr.Source] =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   426
        for {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   427
          atom <- atoms
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   428
          source <- solr_atom(atom)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   429
        } yield Solr.filter(solr_field(field), source)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   430
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   431
      def solr_filter(filter: Filter): List[Solr.Source] =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   432
        filter match {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   433
          case Field_Filter(field, atoms) => solr_atoms(field, atoms)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   434
          case any@Any_Filter(atoms) => any.fields.flatMap(solr_atoms(_, atoms))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   435
        }
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   436
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   437
      def solr_select(select: Select): Solr.Source = {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   438
        val field = solr_field(select.field, select = true)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   439
        Solr.tag(field.name, Solr.filter(field, Solr.OR(select.values.map(Solr.phrase))))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   440
      }
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   441
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   442
      val filter = query.filters.map(filter => Solr.OR(solr_filter(filter)))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   443
      val exclude = query.exclude.flatMap(solr_filter).map(Solr.exclude)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   444
      val selects = query.selects.map(solr_select)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   445
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   446
      (Solr.AND(filter ::: exclude), selects)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   447
    }
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   448
  }
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   449
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   450
  def query_block(db: Solr.Database, id: String): Option[Block] = {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   451
    val q = Solr.filter(Find_Facts.private_data.Fields.id, Solr.phrase(id))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   452
    Find_Facts.private_data.read_blocks(db, q, Nil).blocks.headOption
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   453
  }
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   454
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   455
  def query_blocks(db: Solr.Database, query: Query, cursor: Option[String] = None): Blocks = {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   456
    val (q, fq) = Find_Facts.private_data.solr_query(query)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   457
    Find_Facts.private_data.read_blocks(db, q, fq, cursor = cursor)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   458
  }
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   459
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   460
  def query_stats(db: Solr.Database, query: Query): Stats = {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   461
    val (q, fq) = Find_Facts.private_data.solr_query(query)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   462
    Find_Facts.private_data.query_stats(db, q, fq)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   463
  }
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   464
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   465
  def query_facet(db: Solr.Database, query: Query): Facets = {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   466
    val (q, fq) = Find_Facts.private_data.solr_query(query)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   467
    Find_Facts.private_data.query_facets(db, q, fq)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   468
  }
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   469
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   470
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   471
  /** indexing **/
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   472
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   473
  def make_thy_blocks(
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   474
    options: Options,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   475
    session: Session,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   476
    browser_info_context: Browser_Info.Context,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   477
    document_info: Document_Info,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   478
    theory_context: Export.Theory_Context,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   479
    snapshot: Document.Snapshot,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   480
    chapter: String
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   481
  ): List[Block] = {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   482
    val theory = theory_context.theory
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   483
    val entities = Export_Theory.read_theory(theory_context).entity_iterator.toList
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   484
    val session_name = theory_context.session_context.session_name
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   485
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   486
    val theory_info =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   487
      document_info.theory_by_name(session_name, theory).getOrElse(
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   488
        error("No info for theory " + theory))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   489
    val thy_dir = browser_info_context.theory_dir(theory_info)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   490
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   491
    def make_node_blocks(
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   492
      snapshot: Document.Snapshot,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   493
      command_ranges: List[(String, Text.Range)]
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   494
    ): List[Block] = {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   495
      val version = snapshot.version.id
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   496
      val file = Path.explode(snapshot.node_name.node).squash.implode
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   497
      val url_path = thy_dir + browser_info_context.smart_html(theory_info, snapshot.node_name.node)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   498
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   499
      val elements =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   500
        Browser_Info.Elements(html = Browser_Info.default_elements.html - Markup.ENTITY)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   501
      val node_context = Browser_Info.Node_Context.empty
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   502
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   503
      val content = XML.content(snapshot.xml_markup(elements = Markup.Elements.empty))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   504
      def get_content(range: Text.Range): String =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   505
        Symbol.decode(Line.normalize(range.substring(content)))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   506
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   507
      val document = Line.Document(content.replace('\r', '\u001a'))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   508
      val num_lines = document.lines.length
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   509
      def content_range(start: Line.Position, stop: Line.Position): Text.Range =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   510
        Text.Range(document.offset(start).get, document.offset(stop).get)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   511
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   512
      val index = Symbol.Index(content)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   513
      val node_entities =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   514
        TreeMap.from(entities
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   515
          .filter(entity => entity.file == snapshot.node_name.node)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   516
          .groupBy(entity => index.decode(entity.range).start))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   517
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   518
      val rendering = new Rendering(snapshot, options, session)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   519
      val comment_ranges = rendering.comments(Text.Range.full).map(markup => ("", markup.range))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   520
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   521
      for ((command, range) <- command_ranges ::: comment_ranges) yield {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   522
        val line_range = document.range(range)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   523
        val start_line = line_range.start.line1
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   524
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   525
        val id = file + "|" + range.start + ".." + range.stop
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   526
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   527
        val src_before = get_content(
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   528
          content_range(Line.Position((line_range.start.line - 5).max(0)), line_range.start))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   529
        val src = get_content(range)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   530
        val src_after = get_content(
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   531
          content_range(line_range.stop, Line.Position((line_range.stop.line + 5).min(num_lines))))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   532
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   533
        val xml = snapshot.xml_markup(range, elements = elements.html)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   534
        val html =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   535
          HTML.output(node_context.make_html(elements, xml), hidden = true, structural = false)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   536
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   537
        val entities = node_entities.range(range.start, range.stop).values.toList.flatten.distinct
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   538
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   539
        def get_entities(kind: String): List[String] =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   540
          for {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   541
            entity <- entities
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   542
            if entity.export_kind == kind
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   543
            if range.contains(index.decode(entity.range))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   544
          } yield entity.name
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   545
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   546
        val entity_kname = entities.sortBy(_.name.length).headOption.map(_.kname)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   547
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   548
        val typs = get_entities(Export_Theory.Kind.TYPE)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   549
        val consts = get_entities(Export_Theory.Kind.CONST)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   550
        val thms = get_entities(Export_Theory.Kind.THM)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   551
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   552
        Block(id = id, version = version, chapter = chapter, session = session_name, theory =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   553
          theory, file = file, url_path = url_path, command = command, start_line = start_line,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   554
          src_before = src_before, src = src, src_after = src_after, xml = xml, html = html,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   555
          entity_kname = entity_kname, consts = consts, typs = typs, thms = thms)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   556
      }
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   557
    }
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   558
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   559
    def expand_block(block: Thy_Blocks.Block): List[Thy_Blocks.Block] =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   560
      block match {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   561
        case Thy_Blocks.Thy(inner) => inner.flatMap(expand_block)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   562
        case e@Thy_Blocks.Decl(inner) =>
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   563
          val inner1 = inner.flatMap(expand_block)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   564
          if (inner.length > 1) e :: inner1 else List(e)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   565
        case _ => List(block)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   566
      }
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   567
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   568
    val thy_command_ranges =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   569
      for (block <- Thy_Blocks.read_blocks(snapshot).flatMap(expand_block))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   570
      yield (block.command, block.range)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   571
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   572
    make_node_blocks(snapshot, thy_command_ranges) :::
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   573
      (for {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   574
        blob_name <- snapshot.node_files.tail
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   575
        snapshot1 = snapshot.switch(blob_name)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   576
        if snapshot1.node.source_wellformed
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   577
        range = Text.Range.length(snapshot1.node.source)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   578
        block <- make_node_blocks(snapshot1, List(("", range)))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   579
      } yield block)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   580
  }
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   581
81880
b1f6e80cfff9 add find_facts_index command to use within Isabelle/Scala;
Fabian Huch <huch@in.tum.de>
parents: 81879
diff changeset
   582
  def find_facts_index_command(
b1f6e80cfff9 add find_facts_index command to use within Isabelle/Scala;
Fabian Huch <huch@in.tum.de>
parents: 81879
diff changeset
   583
    sessions: List[String],
b1f6e80cfff9 add find_facts_index command to use within Isabelle/Scala;
Fabian Huch <huch@in.tum.de>
parents: 81879
diff changeset
   584
    ssh: SSH.System = SSH.Local,
b1f6e80cfff9 add find_facts_index command to use within Isabelle/Scala;
Fabian Huch <huch@in.tum.de>
parents: 81879
diff changeset
   585
    isabelle_home: Path = Path.current,
b1f6e80cfff9 add find_facts_index command to use within Isabelle/Scala;
Fabian Huch <huch@in.tum.de>
parents: 81879
diff changeset
   586
    options: List[Options.Spec] = Nil,
b1f6e80cfff9 add find_facts_index command to use within Isabelle/Scala;
Fabian Huch <huch@in.tum.de>
parents: 81879
diff changeset
   587
    dirs: List[Path] = Nil,
b1f6e80cfff9 add find_facts_index command to use within Isabelle/Scala;
Fabian Huch <huch@in.tum.de>
parents: 81879
diff changeset
   588
    clean: Boolean = false
b1f6e80cfff9 add find_facts_index command to use within Isabelle/Scala;
Fabian Huch <huch@in.tum.de>
parents: 81879
diff changeset
   589
  ): String = {
b1f6e80cfff9 add find_facts_index command to use within Isabelle/Scala;
Fabian Huch <huch@in.tum.de>
parents: 81879
diff changeset
   590
    ssh.bash_path(Isabelle_Tool.exe(isabelle_home)) + " find_facts_index" +
b1f6e80cfff9 add find_facts_index command to use within Isabelle/Scala;
Fabian Huch <huch@in.tum.de>
parents: 81879
diff changeset
   591
      dirs.map(dir => " -d " + ssh.bash_path(dir)).mkString +
b1f6e80cfff9 add find_facts_index command to use within Isabelle/Scala;
Fabian Huch <huch@in.tum.de>
parents: 81879
diff changeset
   592
      if_proper(clean, " -c") +
b1f6e80cfff9 add find_facts_index command to use within Isabelle/Scala;
Fabian Huch <huch@in.tum.de>
parents: 81879
diff changeset
   593
      Options.Spec.bash_strings(options, bg = true) +
b1f6e80cfff9 add find_facts_index command to use within Isabelle/Scala;
Fabian Huch <huch@in.tum.de>
parents: 81879
diff changeset
   594
      sessions.map(session => " " + session).mkString
b1f6e80cfff9 add find_facts_index command to use within Isabelle/Scala;
Fabian Huch <huch@in.tum.de>
parents: 81879
diff changeset
   595
  }
81881
f23fc3d21873 tuned whitespace;
Fabian Huch <huch@in.tum.de>
parents: 81880
diff changeset
   596
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   597
  def find_facts_index(
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   598
    options: Options,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   599
    sessions: List[String],
81879
05c0778360d3 clarified: add afp_root argument;
Fabian Huch <huch@in.tum.de>
parents: 81801
diff changeset
   600
    afp_root: Option[Path] = None,
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   601
    dirs: List[Path] = Nil,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   602
    clean: Boolean = false,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   603
    progress: Progress = new Progress
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   604
  ): Unit = {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   605
    val store = Store(options)
81888
6f86f2751a7b clarified: application-specific $SOLR_DATA, e.g. $FIND_FACTS_SOLR_DATA;
Fabian Huch <huch@in.tum.de>
parents: 81881
diff changeset
   606
    val solr = Solr.init(solr_data_dir)
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   607
    val database = options.string("find_facts_database_name")
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   608
    val session = Session(options, Resources.bootstrap)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   609
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   610
    val selection = Sessions.Selection(sessions = sessions)
81879
05c0778360d3 clarified: add afp_root argument;
Fabian Huch <huch@in.tum.de>
parents: 81801
diff changeset
   611
    val session_structure =
05c0778360d3 clarified: add afp_root argument;
Fabian Huch <huch@in.tum.de>
parents: 81801
diff changeset
   612
      Sessions.load_structure(options, dirs = AFP.main_dirs(afp_root) ::: dirs).selection(selection)
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   613
    val deps = Sessions.Deps.load(session_structure)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   614
    val browser_info_context = Browser_Info.context(session_structure)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   615
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   616
    if (sessions.isEmpty) progress.echo("Nothing to index")
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   617
    else {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   618
      val stats =
81888
6f86f2751a7b clarified: application-specific $SOLR_DATA, e.g. $FIND_FACTS_SOLR_DATA;
Fabian Huch <huch@in.tum.de>
parents: 81881
diff changeset
   619
        using(solr.init_database(database, Find_Facts.private_data, clean = clean)) { db =>
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   620
          using(Export.open_database_context(store)) { database_context =>
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   621
            val document_info = Document_Info.read(database_context, deps, sessions)
81879
05c0778360d3 clarified: add afp_root argument;
Fabian Huch <huch@in.tum.de>
parents: 81801
diff changeset
   622
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   623
            def index_session(session_name: String): Unit = {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   624
              using(database_context.open_session0(session_name)) { session_context =>
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   625
                val info = session_structure(session_name)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   626
                progress.echo("Session " + info.chapter + "/" + session_name + " ...")
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   627
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   628
                Find_Facts.private_data.delete_session(db, session_name)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   629
                deps(session_name).proper_session_theories.foreach { name =>
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   630
                  val theory_context = session_context.theory(name.theory)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   631
                  Build.read_theory(theory_context) match {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   632
                    case None => progress.echo_warning("No snapshot for theory " + name.theory)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   633
                    case Some(snapshot) =>
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   634
                      progress.echo("Theory " + name.theory + " ...")
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   635
                      val blocks =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   636
                        make_thy_blocks(options, session, browser_info_context, document_info,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   637
                          theory_context, snapshot, info.chapter)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   638
                      Find_Facts.private_data.update_theory(db, theory_context.theory, blocks)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   639
                  }
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   640
                }
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   641
              }
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   642
            }
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   643
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   644
            Par_List.map(index_session, sessions)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   645
          }
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   646
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   647
          val query = Query(Field_Filter(Field.session, sessions.map(Atom.Exact(_))))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   648
          Find_Facts.query_stats(db, query)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   649
        }
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   650
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   651
      progress.echo("Indexed " + stats.results + " blocks with " +
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   652
        stats.consts + " consts, " + stats.typs + " typs, " + stats.thms + " thms")
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   653
    }
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   654
  }
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   655
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   656
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   657
  /* Isabelle tool wrapper */
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   658
81772
c405ad565d70 tool wrappers with specific java options, notably classpath "$SOLR_JARS";
wenzelm
parents: 81771
diff changeset
   659
  def main_tool1(args: Array[String]): Unit = {
c405ad565d70 tool wrappers with specific java options, notably classpath "$SOLR_JARS";
wenzelm
parents: 81771
diff changeset
   660
    Command_Line.tool {
81879
05c0778360d3 clarified: add afp_root argument;
Fabian Huch <huch@in.tum.de>
parents: 81801
diff changeset
   661
      var afp_root: Option[Path] = None
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   662
      var clean = false
81793
83a09b34de1c implicit session build, similar to "isabelle export";
wenzelm
parents: 81791
diff changeset
   663
      val dirs_buffer = new mutable.ListBuffer[Path]
83a09b34de1c implicit session build, similar to "isabelle export";
wenzelm
parents: 81791
diff changeset
   664
      var no_build = false
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   665
      var options = Options.init()
81801
b1b87d078161 tuned messages: more verbosity;
wenzelm
parents: 81800
diff changeset
   666
      var verbose = false
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   667
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   668
      val getopts = Getopts("""
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   669
  Usage: isabelle find_facts_index [OPTIONS] [SESSIONS ...]
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   670
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   671
    Options are:
81879
05c0778360d3 clarified: add afp_root argument;
Fabian Huch <huch@in.tum.de>
parents: 81801
diff changeset
   672
      -A ROOT      include AFP with given root directory (":" for """ + AFP.BASE.implode + """)
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   673
      -c           clean previous index
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   674
      -d DIR       include session directory
81793
83a09b34de1c implicit session build, similar to "isabelle export";
wenzelm
parents: 81791
diff changeset
   675
      -n           no build -- take existing session build databases
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   676
      -o OPTION    override Isabelle system OPTION (via NAME=VAL or NAME)
81801
b1b87d078161 tuned messages: more verbosity;
wenzelm
parents: 81800
diff changeset
   677
      -v           verbose build
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   678
81801
b1b87d078161 tuned messages: more verbosity;
wenzelm
parents: 81800
diff changeset
   679
    Build and index sessions for Find_Facts.
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   680
  """,
81879
05c0778360d3 clarified: add afp_root argument;
Fabian Huch <huch@in.tum.de>
parents: 81801
diff changeset
   681
        "A:" -> (arg => afp_root = Some(if (arg == ":") AFP.BASE else Path.explode(arg))),
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   682
        "c" -> (_ => clean = true),
81793
83a09b34de1c implicit session build, similar to "isabelle export";
wenzelm
parents: 81791
diff changeset
   683
        "d:" -> (arg => dirs_buffer += Path.explode(arg)),
83a09b34de1c implicit session build, similar to "isabelle export";
wenzelm
parents: 81791
diff changeset
   684
        "n" -> (_ => no_build = true),
81801
b1b87d078161 tuned messages: more verbosity;
wenzelm
parents: 81800
diff changeset
   685
        "o:" -> (arg => options = options + arg),
b1b87d078161 tuned messages: more verbosity;
wenzelm
parents: 81800
diff changeset
   686
        "v" -> (_ => verbose = true))
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   687
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   688
      val sessions = getopts(args)
81793
83a09b34de1c implicit session build, similar to "isabelle export";
wenzelm
parents: 81791
diff changeset
   689
      val dirs = dirs_buffer.toList
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   690
81801
b1b87d078161 tuned messages: more verbosity;
wenzelm
parents: 81800
diff changeset
   691
      val progress = new Console_Progress(verbose = verbose)
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   692
81793
83a09b34de1c implicit session build, similar to "isabelle export";
wenzelm
parents: 81791
diff changeset
   693
83a09b34de1c implicit session build, similar to "isabelle export";
wenzelm
parents: 81791
diff changeset
   694
      /* build */
83a09b34de1c implicit session build, similar to "isabelle export";
wenzelm
parents: 81791
diff changeset
   695
83a09b34de1c implicit session build, similar to "isabelle export";
wenzelm
parents: 81791
diff changeset
   696
      if (!no_build) {
83a09b34de1c implicit session build, similar to "isabelle export";
wenzelm
parents: 81791
diff changeset
   697
        def build(test: Boolean = false): Build.Results =
81801
b1b87d078161 tuned messages: more verbosity;
wenzelm
parents: 81800
diff changeset
   698
          Build.build(options, selection = Sessions.Selection(sessions = sessions), dirs = dirs,
81879
05c0778360d3 clarified: add afp_root argument;
Fabian Huch <huch@in.tum.de>
parents: 81801
diff changeset
   699
            afp_root = afp_root, no_build = test, progress = if (test) new Progress else progress)
81793
83a09b34de1c implicit session build, similar to "isabelle export";
wenzelm
parents: 81791
diff changeset
   700
83a09b34de1c implicit session build, similar to "isabelle export";
wenzelm
parents: 81791
diff changeset
   701
        progress.interrupt_handler {
83a09b34de1c implicit session build, similar to "isabelle export";
wenzelm
parents: 81791
diff changeset
   702
          if (!build(test = true).ok) {
83a09b34de1c implicit session build, similar to "isabelle export";
wenzelm
parents: 81791
diff changeset
   703
            progress.echo("Build started ...")
83a09b34de1c implicit session build, similar to "isabelle export";
wenzelm
parents: 81791
diff changeset
   704
            val rc = build().rc
83a09b34de1c implicit session build, similar to "isabelle export";
wenzelm
parents: 81791
diff changeset
   705
            if (rc != Process_Result.RC.ok) {
83a09b34de1c implicit session build, similar to "isabelle export";
wenzelm
parents: 81791
diff changeset
   706
              Output.error_message("Build failed")
83a09b34de1c implicit session build, similar to "isabelle export";
wenzelm
parents: 81791
diff changeset
   707
              sys.exit(rc)
83a09b34de1c implicit session build, similar to "isabelle export";
wenzelm
parents: 81791
diff changeset
   708
            }
83a09b34de1c implicit session build, similar to "isabelle export";
wenzelm
parents: 81791
diff changeset
   709
          }
83a09b34de1c implicit session build, similar to "isabelle export";
wenzelm
parents: 81791
diff changeset
   710
        }
83a09b34de1c implicit session build, similar to "isabelle export";
wenzelm
parents: 81791
diff changeset
   711
      }
83a09b34de1c implicit session build, similar to "isabelle export";
wenzelm
parents: 81791
diff changeset
   712
83a09b34de1c implicit session build, similar to "isabelle export";
wenzelm
parents: 81791
diff changeset
   713
83a09b34de1c implicit session build, similar to "isabelle export";
wenzelm
parents: 81791
diff changeset
   714
      /* index */
83a09b34de1c implicit session build, similar to "isabelle export";
wenzelm
parents: 81791
diff changeset
   715
81881
f23fc3d21873 tuned whitespace;
Fabian Huch <huch@in.tum.de>
parents: 81880
diff changeset
   716
      find_facts_index(options, sessions, dirs = dirs, afp_root = afp_root, clean = clean,
81879
05c0778360d3 clarified: add afp_root argument;
Fabian Huch <huch@in.tum.de>
parents: 81801
diff changeset
   717
        progress = progress)
81772
c405ad565d70 tool wrappers with specific java options, notably classpath "$SOLR_JARS";
wenzelm
parents: 81771
diff changeset
   718
    }
c405ad565d70 tool wrappers with specific java options, notably classpath "$SOLR_JARS";
wenzelm
parents: 81771
diff changeset
   719
  }
c405ad565d70 tool wrappers with specific java options, notably classpath "$SOLR_JARS";
wenzelm
parents: 81771
diff changeset
   720
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   721
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   722
  /** index components **/
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   723
81895
9d1003cb9844 copy instead of symlink managed Find_Facts indexes: portable, and allows updating with local sessions;
Fabian Huch <huch@in.tum.de>
parents: 81894
diff changeset
   724
  def resolve_indexes(solr: Solr.System): Unit =
9d1003cb9844 copy instead of symlink managed Find_Facts indexes: portable, and allows updating with local sessions;
Fabian Huch <huch@in.tum.de>
parents: 81894
diff changeset
   725
    for {
9d1003cb9844 copy instead of symlink managed Find_Facts indexes: portable, and allows updating with local sessions;
Fabian Huch <huch@in.tum.de>
parents: 81894
diff changeset
   726
      path <- Path.split(Isabelle_System.getenv("FIND_FACTS_INDEXES"))
9d1003cb9844 copy instead of symlink managed Find_Facts indexes: portable, and allows updating with local sessions;
Fabian Huch <huch@in.tum.de>
parents: 81894
diff changeset
   727
      database = Library.perhaps_unprefix("find_facts-", path.file_name)
9d1003cb9844 copy instead of symlink managed Find_Facts indexes: portable, and allows updating with local sessions;
Fabian Huch <huch@in.tum.de>
parents: 81894
diff changeset
   728
      database_dir = solr.database_dir(database)
9d1003cb9844 copy instead of symlink managed Find_Facts indexes: portable, and allows updating with local sessions;
Fabian Huch <huch@in.tum.de>
parents: 81894
diff changeset
   729
      if !database_dir.is_dir
9d1003cb9844 copy instead of symlink managed Find_Facts indexes: portable, and allows updating with local sessions;
Fabian Huch <huch@in.tum.de>
parents: 81894
diff changeset
   730
    } Isabelle_System.copy_dir(path, database_dir, direct = true)
81889
838ed7098c4c clarified: Find_Facts indexes instead of Solr components;
Fabian Huch <huch@in.tum.de>
parents: 81888
diff changeset
   731
838ed7098c4c clarified: Find_Facts indexes instead of Solr components;
Fabian Huch <huch@in.tum.de>
parents: 81888
diff changeset
   732
  def find_facts_index_build(
81894
dffa88c87a08 clarified CLI arg vs. option;
Fabian Huch <huch@in.tum.de>
parents: 81893
diff changeset
   733
    database: String,
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   734
    target_dir: Path = Path.current,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   735
    progress: Progress = new Progress
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   736
  ): Unit = {
81888
6f86f2751a7b clarified: application-specific $SOLR_DATA, e.g. $FIND_FACTS_SOLR_DATA;
Fabian Huch <huch@in.tum.de>
parents: 81881
diff changeset
   737
    val solr = Solr.init(solr_data_dir)
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   738
81889
838ed7098c4c clarified: Find_Facts indexes instead of Solr components;
Fabian Huch <huch@in.tum.de>
parents: 81888
diff changeset
   739
    val component = "find_facts-" + database
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   740
    val component_dir =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   741
      Components.Directory(target_dir + Path.basic(component)).create(progress = progress)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   742
81888
6f86f2751a7b clarified: application-specific $SOLR_DATA, e.g. $FIND_FACTS_SOLR_DATA;
Fabian Huch <huch@in.tum.de>
parents: 81881
diff changeset
   743
    Isabelle_System.copy_dir(solr.database_dir(database), component_dir.path)
81889
838ed7098c4c clarified: Find_Facts indexes instead of Solr components;
Fabian Huch <huch@in.tum.de>
parents: 81888
diff changeset
   744
    component_dir.write_settings(
838ed7098c4c clarified: Find_Facts indexes instead of Solr components;
Fabian Huch <huch@in.tum.de>
parents: 81888
diff changeset
   745
      "FIND_FACTS_INDEXES=\"$FIND_FACTS_INDEXES:$COMPONENT/" + database + "\"")
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   746
  }
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   747
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   748
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   749
  /* Isabelle tool wrapper */
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   750
81889
838ed7098c4c clarified: Find_Facts indexes instead of Solr components;
Fabian Huch <huch@in.tum.de>
parents: 81888
diff changeset
   751
  val isabelle_tool2 = Isabelle_Tool("find_facts_index_build",
81785
dde5b5463429 tuned messages;
wenzelm
parents: 81781
diff changeset
   752
    "build Isabelle component from Find_Facts index", Scala_Project.here,
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   753
    { args =>
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   754
      var target_dir = Path.current
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   755
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   756
      val getopts = Getopts("""
81894
dffa88c87a08 clarified CLI arg vs. option;
Fabian Huch <huch@in.tum.de>
parents: 81893
diff changeset
   757
  Usage: isabelle find_facts_index_build DATABASE
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   758
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   759
    Options are:
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   760
      -D DIR       target directory (default ".")
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   761
81894
dffa88c87a08 clarified CLI arg vs. option;
Fabian Huch <huch@in.tum.de>
parents: 81893
diff changeset
   762
    Build Isabelle component from finalized Find_Facts index with given database name.
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   763
  """,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   764
        "D:" -> (arg => target_dir = Path.explode(arg)))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   765
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   766
      val more_args = getopts(args)
81894
dffa88c87a08 clarified CLI arg vs. option;
Fabian Huch <huch@in.tum.de>
parents: 81893
diff changeset
   767
      val database =
dffa88c87a08 clarified CLI arg vs. option;
Fabian Huch <huch@in.tum.de>
parents: 81893
diff changeset
   768
        more_args match {
dffa88c87a08 clarified CLI arg vs. option;
Fabian Huch <huch@in.tum.de>
parents: 81893
diff changeset
   769
          case database :: Nil => database
dffa88c87a08 clarified CLI arg vs. option;
Fabian Huch <huch@in.tum.de>
parents: 81893
diff changeset
   770
          case _ => getopts.usage()
dffa88c87a08 clarified CLI arg vs. option;
Fabian Huch <huch@in.tum.de>
parents: 81893
diff changeset
   771
        }
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   772
81791
bea8edce9426 proper Console_Progress as for other command-line tools;
wenzelm
parents: 81789
diff changeset
   773
      val progress = new Console_Progress()
bea8edce9426 proper Console_Progress as for other command-line tools;
wenzelm
parents: 81789
diff changeset
   774
81894
dffa88c87a08 clarified CLI arg vs. option;
Fabian Huch <huch@in.tum.de>
parents: 81893
diff changeset
   775
      find_facts_index_build(database, target_dir = target_dir, progress = progress)
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   776
    })
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   777
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   778
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   779
  /** querying **/
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   780
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   781
  /* requests and parsing */
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   782
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   783
  case class Query_Blocks(query: Query, cursor: String)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   784
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   785
  object Parse {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   786
    def atom(json: JSON.T): Option[Atom] =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   787
      JSON.string(json, "value").map(Atom.Value(_)) orElse
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   788
        JSON.string(json, "exact").map(Atom.Exact(_))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   789
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   790
    def field(name: String): Option[Field] = Field.values.find(_.toString == name)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   791
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   792
    def filter(json: JSON.T): Option[Filter] =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   793
      for {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   794
        atoms <- JSON.list(json, "either", atom)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   795
        filter <-
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   796
          JSON.string(json, "field") match {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   797
            case None => Some(Any_Filter(atoms))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   798
            case Some(name) => for (field <- field(name)) yield Field_Filter(field, atoms)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   799
          }
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   800
      } yield filter
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   801
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   802
    def select(json: JSON.T): Option[Select] =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   803
      for {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   804
        name <- JSON.string(json, "field")
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   805
        field <- field(name)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   806
        values <- JSON.strings(json, "values")
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   807
      } yield Select(field, values)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   808
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   809
    def query(json: JSON.T): Option[Query] =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   810
      for {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   811
        filters <- JSON.list(json, "filters", filter)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   812
        exclude <- JSON.list(json, "exclude", filter)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   813
        selects <- JSON.list(json, "selects", select)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   814
      } yield Query(filters, exclude, selects)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   815
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   816
    def query_blocks(json: JSON.T): Option[Query_Blocks] =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   817
      for {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   818
        query <- JSON.value(json, "query", query)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   819
        cursor <- JSON.string(json, "cursor")
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   820
      } yield Query_Blocks(query, cursor)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   821
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   822
    def query_block(json: JSON.T): Option[String] = for (id <- JSON.string(json, "id")) yield id
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   823
  }
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   824
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   825
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   826
  /* responses and encoding */
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   827
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   828
  case class Result(blocks: Blocks, facets: Facets)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   829
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   830
  class Encode(options: Options) {
81771
5589ab62869e clarified options;
wenzelm
parents: 81770
diff changeset
   831
    val library_base_url = Url(options.string("find_facts_url_library"))
5589ab62869e clarified options;
wenzelm
parents: 81770
diff changeset
   832
    val afp_base_url = Url(options.string("find_facts_url_afp"))
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   833
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   834
    def url(block: Block): Url = {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   835
      val base_url = if (block.chapter == AFP.chapter) afp_base_url else library_base_url
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   836
      base_url.resolve(block.url_path.implode)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   837
    }
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   838
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   839
    def block(block: Block): JSON.T =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   840
      JSON.Object(
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   841
        "id" -> block.id,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   842
        "chapter" -> block.chapter,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   843
        "session" -> block.session,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   844
        "theory" -> block.theory,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   845
        "file" -> block.file,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   846
        "file_name" -> block.file_name,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   847
        "url" -> url(block).toString,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   848
        "command" -> block.command,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   849
        "start_line" -> block.start_line,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   850
        "src_before" -> block.src_before,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   851
        "src_after" -> block.src_after,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   852
        "html" -> block.html,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   853
        "entity_kname" -> block.entity_kname.orNull)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   854
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   855
    def blocks(blocks: Blocks): JSON.T =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   856
      JSON.Object(
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   857
        "num_found" -> blocks.num_found,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   858
        "blocks" -> blocks.blocks.map(block),
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   859
        "cursor" -> blocks.cursor)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   860
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   861
    def facets(facet: Facets): JSON.T =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   862
      JSON.Object(
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   863
        "chapter" -> facet.chapter,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   864
        "session" -> facet.session,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   865
        "file_type" -> facet.file_type,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   866
        "theory" -> facet.theory,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   867
        "command" -> facet.command,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   868
        "kinds" -> facet.kinds,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   869
        "consts" -> facet.consts,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   870
        "typs" -> facet.typs,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   871
        "thms" -> facet.thms)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   872
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   873
    def result(result: Result): JSON.T =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   874
      JSON.Object(
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   875
        "blocks" -> blocks(result.blocks),
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   876
        "facets" -> facets(result.facets))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   877
  }
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   878
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   879
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   880
  /* find facts */
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   881
81891
560c7ff87f74 clarified CLI options: web dir only in $FIND_FACTS_HOME_USER/web;
Fabian Huch <huch@in.tum.de>
parents: 81890
diff changeset
   882
  val web_sources: Path = Path.explode("$FIND_FACTS_HOME/web")
560c7ff87f74 clarified CLI options: web dir only in $FIND_FACTS_HOME_USER/web;
Fabian Huch <huch@in.tum.de>
parents: 81890
diff changeset
   883
  val web_dir: Path = Path.explode("$FIND_FACTS_HOME_USER/web")
81795
2856d67c8879 explicit settings FIND_FACTS_WEB and option -w, outside of source (immutable) directory;
wenzelm
parents: 81794
diff changeset
   884
81800
353db84fa71b more explicit default_port;
wenzelm
parents: 81799
diff changeset
   885
  val default_port = 8080
353db84fa71b more explicit default_port;
wenzelm
parents: 81799
diff changeset
   886
81893
78b8b776fd1f clarified;
Fabian Huch <huch@in.tum.de>
parents: 81892
diff changeset
   887
  def find_facts_server(
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   888
    options: Options,
81800
353db84fa71b more explicit default_port;
wenzelm
parents: 81799
diff changeset
   889
    port: Int = default_port,
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   890
    devel: Boolean = false,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   891
    progress: Progress = new Progress
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   892
  ): Unit = {
81891
560c7ff87f74 clarified CLI options: web dir only in $FIND_FACTS_HOME_USER/web;
Fabian Huch <huch@in.tum.de>
parents: 81890
diff changeset
   893
    Isabelle_System.copy_dir(web_sources, web_dir, direct = true)
81795
2856d67c8879 explicit settings FIND_FACTS_WEB and option -w, outside of source (immutable) directory;
wenzelm
parents: 81794
diff changeset
   894
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   895
    val database = options.string("find_facts_database_name")
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   896
    val encode = new Encode(options)
81795
2856d67c8879 explicit settings FIND_FACTS_WEB and option -w, outside of source (immutable) directory;
wenzelm
parents: 81794
diff changeset
   897
    val logo = Bytes.read(web_dir + Path.explode("favicon.ico"))
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   898
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   899
    val isabelle_style = HTML.fonts_css("/fonts/" + _) + "\n\n" + File.read(HTML.isabelle_css)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   900
81795
2856d67c8879 explicit settings FIND_FACTS_WEB and option -w, outside of source (immutable) directory;
wenzelm
parents: 81794
diff changeset
   901
    val project = Elm.Project("Find_Facts", web_dir, head = List(
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   902
      HTML.style("html,body {width: 100%, height: 100%}"),
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   903
      Web_App.More_HTML.icon("data:image/x-icon;base64," + logo.encode_base64.text),
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   904
      HTML.style_file("isabelle.css"),
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   905
      HTML.style_file("https://fonts.googleapis.com/css?family=Roboto:300,400,500|Material+Icons"),
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   906
      HTML.style_file(
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   907
        "https://unpkg.com/material-components-web-elm@9.1.0/dist/material-components-web-elm.min.css"),
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   908
      HTML.script_file(
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   909
        "https://unpkg.com/material-components-web-elm@9.1.0/dist/material-components-web-elm.min.js")))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   910
81789
e08eab19cdeb clarified signature: progress is usually optional;
wenzelm
parents: 81785
diff changeset
   911
    val frontend = project.build_html(progress = progress)
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   912
81888
6f86f2751a7b clarified: application-specific $SOLR_DATA, e.g. $FIND_FACTS_SOLR_DATA;
Fabian Huch <huch@in.tum.de>
parents: 81881
diff changeset
   913
    val solr = Solr.init(solr_data_dir)
81889
838ed7098c4c clarified: Find_Facts indexes instead of Solr components;
Fabian Huch <huch@in.tum.de>
parents: 81888
diff changeset
   914
    resolve_indexes(solr)
838ed7098c4c clarified: Find_Facts indexes instead of Solr components;
Fabian Huch <huch@in.tum.de>
parents: 81888
diff changeset
   915
81888
6f86f2751a7b clarified: application-specific $SOLR_DATA, e.g. $FIND_FACTS_SOLR_DATA;
Fabian Huch <huch@in.tum.de>
parents: 81881
diff changeset
   916
    using(solr.open_database(database)) { db =>
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   917
      val stats = Find_Facts.query_stats(db, Query(Nil))
81799
150651b9d2a2 tuned messages;
wenzelm
parents: 81795
diff changeset
   918
      progress.echo("Started Find_Facts with " + stats.results + " blocks, " +
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   919
        stats.consts + " consts, " + stats.typs + " typs, " + stats.thms + " thms")
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   920
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   921
      val server =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   922
        HTTP.server(port, name = "", services = List(
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   923
          HTTP.Fonts_Service,
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   924
          new HTTP.Service("isabelle.css") {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   925
            def apply(request: HTTP.Request): Option[HTTP.Response] =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   926
              Some(HTTP.Response(Bytes(isabelle_style), "text/css"))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   927
          },
81892
f1d520cd7575 clarified find_facts URL;
Fabian Huch <huch@in.tum.de>
parents: 81891
diff changeset
   928
          new HTTP.Service("find_facts") {
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   929
            def apply(request: HTTP.Request): Option[HTTP.Response] =
81789
e08eab19cdeb clarified signature: progress is usually optional;
wenzelm
parents: 81785
diff changeset
   930
              Some(HTTP.Response.html(
e08eab19cdeb clarified signature: progress is usually optional;
wenzelm
parents: 81785
diff changeset
   931
                if (devel) project.build_html(progress = progress) else frontend))
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   932
          },
81781
10669f47f6fd clarified signature and modules;
wenzelm
parents: 81775
diff changeset
   933
          new HTTP.REST_Service("api/block", progress = progress) {
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   934
            def handle(body: JSON.T): Option[JSON.T] =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   935
              for {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   936
                request <- Parse.query_block(body)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   937
                block <- query_block(db, request)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   938
              } yield encode.block(block)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   939
          },
81781
10669f47f6fd clarified signature and modules;
wenzelm
parents: 81775
diff changeset
   940
          new HTTP.REST_Service("api/blocks", progress = progress) {
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   941
            def handle(body: JSON.T): Option[JSON.T] =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   942
              for (request <- Parse.query_blocks(body))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   943
              yield encode.blocks(query_blocks(db, request.query, Some(request.cursor)))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   944
          },
81781
10669f47f6fd clarified signature and modules;
wenzelm
parents: 81775
diff changeset
   945
          new HTTP.REST_Service("api/query", progress = progress) {
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   946
            def handle(body: JSON.T): Option[JSON.T] =
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   947
              for (query <- Parse.query(body)) yield {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   948
                val facet = query_facet(db, query)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   949
                val blocks = query_blocks(db, query)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   950
                encode.result(Result(blocks, facet))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   951
              }
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   952
          }))
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   953
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   954
      server.start()
81892
f1d520cd7575 clarified find_facts URL;
Fabian Huch <huch@in.tum.de>
parents: 81891
diff changeset
   955
      progress.echo("Server started " + server.toString + "/find_facts")
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   956
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   957
      @tailrec
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   958
      def loop(): Unit = {
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   959
        Thread.sleep(Long.MaxValue)
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   960
        loop()
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   961
      }
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   962
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   963
      Isabelle_Thread.interrupt_handler(_ => server.stop()) { loop() }
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   964
    }
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   965
  }
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   966
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   967
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   968
  /* Isabelle tool wrapper */
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   969
81772
c405ad565d70 tool wrappers with specific java options, notably classpath "$SOLR_JARS";
wenzelm
parents: 81771
diff changeset
   970
  def main_tool3 (args: Array[String]): Unit = {
c405ad565d70 tool wrappers with specific java options, notably classpath "$SOLR_JARS";
wenzelm
parents: 81771
diff changeset
   971
    Command_Line.tool {
c405ad565d70 tool wrappers with specific java options, notably classpath "$SOLR_JARS";
wenzelm
parents: 81771
diff changeset
   972
      var devel = false
c405ad565d70 tool wrappers with specific java options, notably classpath "$SOLR_JARS";
wenzelm
parents: 81771
diff changeset
   973
      var options = Options.init()
81800
353db84fa71b more explicit default_port;
wenzelm
parents: 81799
diff changeset
   974
      var port = default_port
81772
c405ad565d70 tool wrappers with specific java options, notably classpath "$SOLR_JARS";
wenzelm
parents: 81771
diff changeset
   975
      var verbose = false
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   976
81772
c405ad565d70 tool wrappers with specific java options, notably classpath "$SOLR_JARS";
wenzelm
parents: 81771
diff changeset
   977
      val getopts = Getopts("""
81794
9f3169b9d2d2 tuned message;
wenzelm
parents: 81793
diff changeset
   978
Usage: isabelle find_facts_server [OPTIONS]
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   979
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   980
  Options are:
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   981
    -d           devel mode
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   982
    -o OPTION    override Isabelle system OPTION (via NAME=VAL or NAME)
81800
353db84fa71b more explicit default_port;
wenzelm
parents: 81799
diff changeset
   983
    -p PORT      explicit web server port (default: """ + default_port + """)
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   984
    -v           verbose server
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   985
81794
9f3169b9d2d2 tuned message;
wenzelm
parents: 81793
diff changeset
   986
  Run server for Find_Facts.
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   987
""",
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   988
        "d" -> (_ => devel = true),
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   989
        "o:" -> (arg => options = options + arg),
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   990
        "p:" -> (arg => port = Value.Int.parse(arg)),
81891
560c7ff87f74 clarified CLI options: web dir only in $FIND_FACTS_HOME_USER/web;
Fabian Huch <huch@in.tum.de>
parents: 81890
diff changeset
   991
        "v" -> (_ => verbose = true))
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   992
81772
c405ad565d70 tool wrappers with specific java options, notably classpath "$SOLR_JARS";
wenzelm
parents: 81771
diff changeset
   993
      val more_args = getopts(args)
c405ad565d70 tool wrappers with specific java options, notably classpath "$SOLR_JARS";
wenzelm
parents: 81771
diff changeset
   994
      if (more_args.nonEmpty) getopts.usage()
c405ad565d70 tool wrappers with specific java options, notably classpath "$SOLR_JARS";
wenzelm
parents: 81771
diff changeset
   995
c405ad565d70 tool wrappers with specific java options, notably classpath "$SOLR_JARS";
wenzelm
parents: 81771
diff changeset
   996
      val progress = new Console_Progress(verbose = verbose)
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
   997
81893
78b8b776fd1f clarified;
Fabian Huch <huch@in.tum.de>
parents: 81892
diff changeset
   998
      find_facts_server(options, port = port, devel = devel, progress = progress)
81772
c405ad565d70 tool wrappers with specific java options, notably classpath "$SOLR_JARS";
wenzelm
parents: 81771
diff changeset
   999
    }
c405ad565d70 tool wrappers with specific java options, notably classpath "$SOLR_JARS";
wenzelm
parents: 81771
diff changeset
  1000
  }
81764
fcba3250fb2a original sources of find-facts 271b5af0c4c8;
wenzelm
parents:
diff changeset
  1001
}