def evaluate(self): verbose_print('Evaluating union decomposition ({} clauses)'.format( len(self.mapping_generators)), indent_after=True) sequence = make_sequence(self.union_expression()) result = [] for item in sequence: verbose_print( lambda: u'Visiting item {0}'.format(debug_dump_anything(item)), indent_after=True) with variable_scope(): push_variable('_', make_sequence(item)) if not hasattr(item, 'union_index'): raise HqueryEvaluationError( "Union decomposition applied to something that wasn't produced by a union" ) if item.union_index >= len(self.mapping_generators): raise HqueryEvaluationError( "Decomposed union had more clauses than its mapping") this_result = make_sequence( self.mapping_generators[item.union_index]()) verbose_print( 'Mapping yielded {0} results for this visit'.format( len(this_result))) result = sequence_concat(result, this_result) verbose_print('Visit finished', outdent_before=True) verbose_print('Union decomposition completed', outdent_before=True) return result
def _evaluate_iteration(self): with variable_scope(): self._push_global_variables() sequence = make_sequence(self.sequence_expression()) verbose_print( 'Iterating over sequence containing {0} items'.format( len(sequence))) result = [] for item in sequence: verbose_print(lambda: u'Visiting item {0}'.format( debug_dump_anything(item)), indent_after=True) with variable_scope(): push_variable(self.sequence_variable, make_sequence(item)) self._push_iteration_variables() this_result = make_sequence(self.return_expression()) verbose_print( 'Return clause yielded {0} results for this visit'. format(len(this_result))) result = sequence_concat(result, this_result) verbose_print('Visit finished', outdent_before=True) return result
def evaluate(self): verbose_print('Evaluating union decomposition ({} clauses)'.format(len(self.mapping_generators)), indent_after=True) sequence = make_sequence(self.union_expression()) result = [] for item in sequence: verbose_print(lambda: u'Visiting item {0}'.format(debug_dump_anything(item)), indent_after=True) with variable_scope(): push_variable('_', make_sequence(item)) if not hasattr(item, 'union_index'): raise HqueryEvaluationError( "Union decomposition applied to something that wasn't produced by a union" ) if item.union_index >= len(self.mapping_generators): raise HqueryEvaluationError("Decomposed union had more clauses than its mapping") this_result = make_sequence(self.mapping_generators[item.union_index]()) verbose_print( 'Mapping yielded {0} results for this visit'.format( len(this_result))) result = sequence_concat(result, this_result) verbose_print('Visit finished', outdent_before=True) verbose_print('Union decomposition completed', outdent_before=True) return result
def evaluate(self): result = dict() for item in make_sequence( self.contents()) if self.contents is not None else []: if isinstance(item, HashKeyValue): if is_sequence(item.value) and len(item.value) == 1: item.value = item.value[0] if is_number(item.value) or is_boolean(item.value): result[item.key] = item.value.value elif is_hash(item.value) or is_array(item.value): result[item.key] = item.value.contents else: result[item.key] = string_value(item.value) elif is_tag_node(item): self._gab('adding element "{0}" to contents'.format(item.name)) self._process_tag(result, item) elif is_text_node(item) or is_string(item): self._gab('adding text "{0}" to contents'.format( debug_dump_long_string(string_value(item)))) result['text'] = self._append_to_text( result['text'] if 'text' in result else '', string_value(item)) else: value_desc = debug_dump_node(item) if is_any_node( item) else object_type_name(item) raise HqueryEvaluationError( 'Cannot use {0} as a content object in a computed JSON hash constructor' .format(value_desc)) self._process_filters(result) return JsonHash(result)
def evaluate(self): result = dict() for item in make_sequence(self.contents()) if self.contents is not None else []: if isinstance(item, HashKeyValue): if is_sequence(item.value) and len(item.value) == 1: item.value = item.value[0] if is_number(item.value) or is_boolean(item.value): result[item.key] = item.value.value elif is_hash(item.value) or is_array(item.value): result[item.key] = item.value.contents else: result[item.key] = string_value(item.value) elif is_tag_node(item): self._gab('adding element "{0}" to contents'.format(item.name)) self._process_tag(result, item) elif is_text_node(item) or is_string(item): self._gab('adding text "{0}" to contents'.format(debug_dump_long_string(string_value(item)))) result['text'] = self._append_to_text(result['text'] if 'text' in result else '', string_value(item)) else: value_desc = debug_dump_node(item) if is_any_node(item) else object_type_name(item) raise HqueryEvaluationError( 'Cannot use {0} as a content object in a computed JSON hash constructor'.format(value_desc) ) self._process_filters(result) return JsonHash(result)
def sum(*args): if len(args) >= 1: sequence = make_sequence(args[0]) else: sequence = make_sequence([]) if len(args) >= 2: zero = args[1] else: zero = number(0) if len(sequence) == 0: return zero else: result = number(0) for item in sequence: result += number(item) return result
def _evaluate_iteration(self): with variable_scope(): self._push_global_variables() sequence = make_sequence(self.sequence_expression()) verbose_print('Iterating over sequence containing {0} items'.format(len(sequence))) result = [] for item in sequence: verbose_print(lambda: u'Visiting item {0}'.format(debug_dump_anything(item)), indent_after=True) with variable_scope(): push_variable(self.sequence_variable, make_sequence(item)) self._push_iteration_variables() this_result = make_sequence(self.return_expression()) verbose_print('Return clause yielded {0} results for this visit'.format(len(this_result))) result = sequence_concat(result, this_result) verbose_print('Visit finished', outdent_before=True) return result
def evaluate(self): result = '' for value in make_sequence(self.contents()) if self.contents is not None else []: if is_string(value) or is_number(value) or is_boolean(value): result = self._append_to_contents(result, str(value)) elif is_attribute_node(value): result = self._append_to_contents(result, value.value) elif is_tag_node(value): result = self._append_to_contents(result, string_value(value)) else: value_desc = debug_dump_node(value) if is_any_node(value) else object_type_name(value) raise HqueryEvaluationError( 'Cannot use {0} as a content object in a computed attribute constructor'.format(value_desc) ) return AttributeNode(self.name, result)
def evaluate(self): soup = BeautifulSoup('<{0}></{0}>'.format(self.name), 'html.parser') result = getattr(soup, self.name) for value in make_sequence(self.contents()) if self.contents is not None else []: if is_tag_node(value): result.append(self._clone_tag(value)) elif is_attribute_node(value): result[value.name] = value.value elif is_string(value) or is_number(value) or is_boolean(value): result.append(str(value)) else: value_desc = debug_dump_node(value) if is_any_node(value) else object_type_name(value) raise HqueryEvaluationError( 'Cannot use {0} as a content object in a computed element constructor'.format(value_desc) ) return make_node_set(result)
def evaluate(self): result = '' for value in make_sequence( self.contents()) if self.contents is not None else []: if is_string(value) or is_number(value) or is_boolean(value): result = self._append_to_contents(result, str(value)) elif is_attribute_node(value): result = self._append_to_contents(result, value.value) elif is_tag_node(value): result = self._append_to_contents(result, string_value(value)) else: value_desc = debug_dump_node(value) if is_any_node( value) else object_type_name(value) raise HqueryEvaluationError( 'Cannot use {0} as a content object in a computed attribute constructor' .format(value_desc)) return AttributeNode(self.name, result)
def evaluate(self): soup = BeautifulSoup('<{0}></{0}>'.format(self.name), 'html.parser') result = getattr(soup, self.name) for value in make_sequence( self.contents()) if self.contents is not None else []: if is_tag_node(value): result.append(self._clone_tag(value)) elif is_attribute_node(value): result[value.name] = value.value elif is_string(value) or is_number(value) or is_boolean(value): result.append(str(value)) else: value_desc = debug_dump_node(value) if is_any_node( value) else object_type_name(value) raise HqueryEvaluationError( 'Cannot use {0} as a content object in a computed element constructor' .format(value_desc)) return make_node_set(result)
def evaluate(self): return JsonArray([ self._make_array_item(item) for item in make_sequence(self.contents()) ])
def evaluate(self): return JsonArray([self._make_array_item(item) for item in make_sequence(self.contents())])