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^