note description: "Class to write objects into Solr documents" author: "" date: "$Date$" revision: "$Revision$" class SOLR_OBJECTS_WRITER inherit SEM_OBJECTS_WRITER SOLR_QUERYABLE_WRITER [SEM_QUERYABLE] EPA_SHARED_EQUALITY_TESTERS create make_with_medium feature{NONE} -- Initialization make_with_medium (a_medium: like medium) -- Initialize `medium' with `a_medium'. do set_medium (a_medium) end feature -- Basic operations write (a_objects: like queryable) -- Write `a_objects' into `medium'. do queryable := a_objects queryable_dynamic_type_name_table := type_name_table (queryable.variable_dynamic_type_table) medium.put_string (once "%N") append_queryable_type (queryable) append_uuid append_variables (queryable.variables, variables_field, True, False, False) append_variables (queryable.variables, variable_types_field, False, True, False) append_properties append_serialization append_content medium.put_string (once "%N") end feature{NONE} -- Implementation queryable_dynamic_type_name_table: like type_name_table -- Dynamic type name table for variables in `queryable' feature{NONE} -- Implementation append_properties -- Append properties from `queryable' into `medium'. local l_equations: like queryable.properties.new_cursor l_expr: EPA_EXPRESSION l_queryable: like queryable l_var_dtype_tbl: like type_name_table l_var_stype_tbl: like type_name_table l_type: INTEGER l_anonymous: STRING a_prefix: STRING l_equation: EPA_EQUATION l_boost: DOUBLE l_value_text: STRING l_value: EPA_EXPRESSION_VALUE l_prefix: STRING l_dmeta: HASH_TABLE [DS_HASH_SET [STRING], STRING] l_smeta: HASH_TABLE [DS_HASH_SET [STRING], STRING] l_body: STRING l_field_name: STRING l_meta_value: STRING l_set: DS_HASH_SET_CURSOR [STRING] l_state: EPA_STATE do l_queryable := queryable l_var_dtype_tbl := queryable_dynamic_type_name_table l_boost := default_boost_value l_prefix := property_prefix create l_dmeta.make (400) l_dmeta.compare_objects create l_smeta.make (400) l_smeta.compare_objects -- Iterate through all interface contracts from `queryable'. l_state := integer_argumented_expression_equations (l_queryable.properties) l_state.append (l_queryable.properties) from l_equations := l_state.new_cursor l_equations.start until l_equations.after loop l_equation := l_equations.item l_expr := l_equation.expression l_value := l_equation.value l_value_text := l_value.text l_type := type_of_equation (l_equation) -- Only handle integer value and boolean values. if l_value.is_integer or l_value.is_boolean then -- Output anonymous format. l_anonymous := l_queryable.anonymous_expression_text (l_expr) append_field_with_data (field_name_for_equation (l_anonymous, l_equation, anonymous_type_form, False, l_prefix), l_value_text, l_type, l_boost) -- Output dynamic type format. l_body := expression_with_replacements (l_expr, l_var_dtype_tbl, True) append_field_with_data ( field_name_for_equation (l_body, l_equation, dynamic_type_Form, False, l_prefix), l_value_text, l_type, l_boost) l_field_name := field_name_for_equation (l_body, l_equation, dynamic_type_form, True, l_prefix) l_meta_value := text_for_variable_indexes_and_value (l_anonymous, l_value_text) extend_string_into_list (l_dmeta, l_meta_value, l_field_name) -- Output static type form. static_type_form_generator.generate (l_queryable.context, l_expr, l_var_dtype_tbl) l_body := static_type_form_generator.output.string_representation append_field_with_data ( field_name_for_equation (l_body, l_equation, static_type_form, False, l_prefix), l_value_text, l_type, l_boost) l_field_name := field_name_for_equation (l_body, l_equation, static_type_form, True, l_prefix) l_meta_value := text_for_variable_indexes_and_value (l_anonymous, l_value_text) extend_string_into_list (l_smeta, l_meta_value, l_field_name) end l_equations.forth end across <> as l_metas loop across l_metas.item as l_items loop create l_value_text.make (256) from l_set := l_items.item.new_cursor l_set.start until l_set.after loop l_value_text.append (l_set.item) l_set.forth end append_field_with_data (l_items.key, l_value_text, ir_string_value_type, default_boost_value) end end end append_serialization -- Append serialization from `queryable' to `medium'. do append_string_field (serialization_field, queryable.serialization_as_string) end append_content -- Append content from `queryable'e to `medium'. local l_cursor: DS_HASH_SET_CURSOR [EPA_EXPRESSION] l_types: HASH_TABLE [INTEGER, STRING] l_type_name: STRING l_content: STRING do create l_types.make (10) l_types.compare_objects from l_cursor := queryable.variables.new_cursor l_cursor.start until l_cursor.after loop l_type_name := output_type_name (l_cursor.item.type.name) l_types.force (l_types.item (l_type_name) + 1, l_type_name) l_cursor.forth end create l_content.make (256) across l_types as l_type_counts loop l_content.append (l_type_counts.key) l_content.append (once ": ") l_content.append (l_type_counts.item.out) l_content.append (once "; ") end append_string_field (content_field, l_content) end integer_argumented_expression_equations (a_state: EPA_STATE): EPA_STATE -- A state containing equations for integer argumented equations in `a_state' -- For example, if in `a_state', there is two expressions: "i_th (1) = 0x1234" and "b = 0x1234", -- thene the result has two equations: "i_th (1) = b == True" and "b = i_th (1) == True". local l_matcher: like integer_argumented_expression_matcher l_values: DS_HASH_TABLE [LINKED_LIST [EPA_EXPRESSION], EPA_EXPRESSION_VALUE] l_int_exprs: DS_HASH_TABLE [EPA_EXPRESSION_VALUE, EPA_EXPRESSION] l_cursor: DS_HASH_SET_CURSOR [EPA_EQUATION] l_expr: EPA_EXPRESSION l_value: EPA_EXPRESSION_VALUE l_equation: EPA_EQUATION l_expr_list: LINKED_LIST [EPA_EXPRESSION] l_new_equation: EPA_EQUATION l_true_value: EPA_BOOLEAN_VALUE l_expr2: EPA_EXPRESSION l_equ_expr: EPA_AST_EXPRESSION l_class: CLASS_C l_feature: FEATURE_I do l_class := a_state.class_ l_feature := a_state.feature_ create l_true_value.make (True) l_matcher := integer_argumented_expression_matcher create l_values.make (100) l_values.set_key_equality_tester (expression_value_equality_tester) create l_int_exprs.make (50) l_int_exprs.set_key_equality_tester (expression_equality_tester) from l_cursor := a_state.new_cursor l_cursor.start until l_cursor.after loop l_equation := l_cursor.item l_expr := l_equation.expression l_value := l_equation.value l_values.search (l_value) if l_values.found then l_expr_list := l_values.found_item else create l_expr_list.make l_values.put (l_expr_list, l_value) end l_expr_list.extend (l_expr) l_matcher.match (l_expr.text) if l_matcher.has_matched then -- `l_expr' is an integer argumented expression. l_int_exprs.force_last (l_value, l_expr) end l_cursor.forth end create Result.make (100, a_state.class_, a_state.feature_) from l_int_exprs.start until l_int_exprs.after loop l_expr := l_int_exprs.key_for_iteration l_value := l_int_exprs.item_for_iteration l_values.search (l_value) if l_values.found then l_expr_list := l_values.found_item across l_expr_list as l_exprs loop l_expr2 := l_exprs.item if l_expr.text /~ l_expr2.text then create l_equ_expr.make_with_text (l_class, l_feature, l_expr.text + once " = " + l_expr2.text, l_class) Result.force_last (create {EPA_EQUATION}.make (l_equ_expr, l_true_value)) create l_equ_expr.make_with_text (l_class, l_feature, l_expr2.text + once " = " + l_expr.text, l_class) Result.force_last (create {EPA_EQUATION}.make (l_equ_expr, l_true_value)) end end end l_int_exprs.forth end end integer_argumented_expression_matcher: RX_PCRE_REGULAR_EXPRESSION -- Regular expression match engine once create Result.make Result.compile (".*\([0-9\-]+\).*") end end