hyf

Context-aware query service for Radroots
git clone https://radroots.dev/git/hyf.git
Log | Files | Refs | README | LICENSE

farm_operation.mojo (3838B)


      1 from std.collections import List
      2 from json import Value, loads
      3 
      4 from hyf_application.context import interpretation_source
      5 from hyf_core.normalization.candidates import Candidate, discover_candidates
      6 
      7 
      8 def _has_key(value: Value, key: String) -> Bool:
      9     for candidate in value.object_keys():
     10         if candidate == key:
     11             return True
     12     return False
     13 
     14 
     15 def _string_list(value: Value) raises -> List[String]:
     16     var items = List[String]()
     17     if not value.is_array():
     18         return items^
     19     for entry in value.array_items():
     20         if entry.is_string():
     21             items.append(entry.string_value())
     22     return items^
     23 
     24 
     25 def _string_array_value(items: List[String]) raises -> Value:
     26     var array = loads("[]")
     27     for item in items:
     28         array.append(Value(String(item)))
     29     return array^
     30 
     31 
     32 def _evidence_value(evidence: Candidate) raises -> Value:
     33     var value = loads("{}")
     34     value.set("start", Value(evidence.start))
     35     value.set("end", Value(evidence.end))
     36     value.set("method", Value("span"))
     37     return value^
     38 
     39 
     40 def execute_farm_update_interpret(input: Value) raises -> Value:
     41     if not input.is_object() or not _has_key(input, "source"):
     42         raise Error("farm_update.interpret input requires 'source'")
     43     var source = input["source"]
     44     var parsed = interpretation_source(
     45         source_id=source["source_id"].string_value(),
     46         revision=source["revision"].string_value(),
     47         text=source["text"].string_value(),
     48         source_time=source["source_time"].string_value(),
     49         timezone=source["timezone"].string_value(),
     50         actor_id=source["actor_id"].string_value(),
     51         farm_id=source["farm_id"].string_value(),
     52     )
     53 
     54     var products = List[String]()
     55     var units = List[String]()
     56     var dates = List[String]()
     57     if _has_key(input, "taxonomy"):
     58         var taxonomy = input["taxonomy"]
     59         if _has_key(taxonomy, "products"):
     60             products = _string_list(taxonomy["products"])
     61         if _has_key(taxonomy, "units"):
     62             units = _string_list(taxonomy["units"])
     63         if _has_key(taxonomy, "dates"):
     64             dates = _string_list(taxonomy["dates"])
     65 
     66     var candidates = discover_candidates(parsed.text, products, units, dates)
     67 
     68     var claims = loads("[]")
     69     var review_required = False
     70     var claim_index = 1
     71     for candidate in candidates:
     72         if candidate.kind != "product":
     73             continue
     74         var claim = loads("{}")
     75         claim.set("claim_id", Value("claim-" + String(claim_index)))
     76         var product = loads("{}")
     77         product.set("phrase", Value(String(candidate.text)))
     78         product.set("catalogue_id", Value(String(candidate.text)))
     79         product.set("resolution", Value("resolved"))
     80         claim.set("product", product)
     81         claim.set("status", Value("unclear"))
     82         var evidence = loads("[]")
     83         evidence.append(_evidence_value(candidate))
     84         claim.set("evidence", evidence)
     85         claim.set("review_required", Value(True))
     86         claims.append(claim)
     87         review_required = True
     88         claim_index += 1
     89 
     90     var output = loads("{}")
     91     output.set("claims", claims)
     92     output.set("proposed_changes", loads("[]"))
     93     var review = loads("{}")
     94     review.set("required", Value(review_required))
     95     var clarifications = loads("[]")
     96     if review_required:
     97         var clarification = loads("{}")
     98         clarification.set("field", Value("status"))
     99         clarification.set("reason", Value("information_needed"))
    100         clarifications.append(clarification)
    101     review.set("clarifications", clarifications)
    102     output.set("review", review)
    103     var execution = loads("{}")
    104     execution.set("status", Value("complete"))
    105     execution.set("provider_calls", Value(0))
    106     output.set("execution", execution)
    107     output.set("original_source_preserved", Value(True))
    108     return output^