def _combine(self, registry: Registry, language: str, first: Message, second: Message) -> Message: log.debug("Combining {} and {}".format( [c.value for c in first.template.components], [c.value for c in second.template.components])) shared_prefix = self._get_combinable_prefix(first, second) log.debug(f"Shared prefix is {[e.value for e in shared_prefix]}") combined = [c for c in first.template.components] conjunctions = registry.get("CONJUNCTIONS").get(language, None) if not conjunctions: conjunctions = (defaultdict(lambda x: "NO-CONJUNCTION-DICT"), ) combined.append( Literal( conjunctions.get("default_combiner", "MISSING-DEFAULT-CONJUCTION"))) combined.extend(second.template.components[len(shared_prefix):]) log.debug("Combined thing is {}".format([c.value for c in combined])) new_message = Message( facts=first.facts + [fact for fact in second.facts if fact not in first.facts], importance_coefficient=first.importance_coefficient, ) new_message.template = Template(combined) new_message.prevent_aggregation = True return new_message
def _add_template_to_message(message: Message, template_original: Template, all_messages: List[Message]) -> None: """ Adds a matching template to a message, also adding the facts used by the template to the message. :param message: The message to be fitted with a template :param template_original: The template to be added to the message. :param all_messages: Other available messages, some of which will be needed to match possible secondary rules in the template. :return: Nothing """ template = template_original.copy() used_facts = template.fill(message, all_messages) if used_facts: log.debug("Successfully linked template to message") else: log.error( "Chosen template '{}' for fact '{}' could not be used! " "Falling back to default templates".format(template.display_template(), message.main_fact) ) template = DefaultTemplate("") message.template = template message.facts = used_facts