def __wrap(query_model): """ create an outer query containing the variables, select columns, offset, limit, order, :param query_model: :return: """ new_query_model = QueryModel() new_query_model.variables = copy.copy(query_model.variables) # all prefixes are already in query_model1 new_query_model.from_clause = copy.copy(query_model.from_clause) new_query_model.select_columns = copy.copy(query_model.select_columns) new_query_model.offset = query_model.offset new_query_model.limit = query_model.limit new_query_model.order_clause = copy.copy(query_model.order_clause) new_query_model.add_graph_clause(query_model) QueryModel.clean_inner_qm(query_model) return new_query_model
def _outer_join(query_model1, query_model2): joined_query_model = QueryModel() joined_query_model.prefixes = copy.copy( query_model1.prefixes) # all prefixes are already in query_model1 joined_query_model.variables = copy.copy( query_model1.variables) # all prefixes are already in query_model1 joined_query_model.from_clause = copy.copy(query_model1.from_clause) joined_query_model.select_columns = copy.copy( query_model1.select_columns) joined_query_model.offset = query_model1.offset joined_query_model.limit = query_model1.limit joined_query_model.order_clause = copy.copy(query_model1.order_clause) QueryModel.clean_inner_qm(query_model1) QueryModel.clean_inner_qm(query_model2) joined_query_model.add_unions(query_model1) joined_query_model.add_unions(query_model2) return joined_query_model
def __join_grouped_grouped(self, query_model1, query_model2): joined_query_model = JoinOperator.__create_outer_quer_model(query_model1, query_model2) joined_query_model.from_clause = copy.copy(query_model1.from_clause) QueryModel.clean_inner_qm(query_model1) QueryModel.clean_inner_qm(query_model2) # add subqueries if self.join_type == JoinType.InnerJoin: joined_query_model.add_subquery(query_model1) joined_query_model.add_subquery(query_model2) elif self.join_type == JoinType.LeftOuterJoin: joined_query_model.add_subquery(query_model1) joined_query_model.add_optional_subquery(query_model2) elif self.join_type == JoinType.RightOuterJoin: joined_query_model.add_subquery(query_model2) joined_query_model.add_optional_subquery(query_model1) else: # outer join query_model1.from_clause = copy.copy(joined_query_model.from_clause) return JoinOperator._outer_join(joined_query_model, query_model1, query_model2) return joined_query_model
def _outer_join(joined_query_model, query_model1, query_model2): joined_query_model.from_clause = copy.copy(query_model1.from_clause) query_model1_copy = copy.deepcopy(query_model1) query_model2_copy = copy.deepcopy(query_model2) #if len(query_model1.groupBy_columns) > 0: if True: new_query_model1 = JoinOperator.__wrap_in_subquery(query_model1) QueryModel.clean_inner_qm(query_model2_copy) QueryModel.clean_inner_qm(query_model1_copy) new_query_model1.add_subquery(query_model1_copy) new_query_model1.add_optional_subquery(query_model2_copy) else: query_model1.add_optional_subquery(query_model2_copy) #if len(query_model2.groupBy_columns) > 0: if True: new_query_model2 = JoinOperator.__wrap_in_subquery(query_model2) new_query_model2.add_subquery(query_model2_copy) new_query_model2.add_optional_subquery(query_model1_copy) else: query_model2.add_optional_subquery(query_model1_copy) joined_query_model.add_unions(new_query_model1) joined_query_model.add_unions(new_query_model2) return joined_query_model
def __join_grouped_grouped(self, query_model1, query_model2): joined_query_model = QueryModel() joined_query_model.prefixes = copy.copy( query_model1.prefixes) # all prefixes are already in query_model1 joined_query_model.add_prefixes(query_model2.prefixes) joined_query_model.variables = copy.copy( query_model1.variables.union(query_model2.variables) ) # all prefixes are already in query_model1 joined_query_model.from_clause = copy.copy(query_model1.from_clause) joined_query_model.select_columns = copy.copy( query_model1.select_columns.union(query_model2.select_columns)) joined_query_model.offset = min(query_model1.offset, query_model2.offset) joined_query_model.limit = max(query_model1.limit, query_model2.limit) query_model1.order_clause.update(query_model2.order_clause) joined_query_model.order_clause = copy.copy(query_model1.order_clause) QueryModel.clean_inner_qm(query_model1) QueryModel.clean_inner_qm(query_model2) # add subqueries if self.join_type == JoinType.InnerJoin: joined_query_model.add_subquery(query_model1) joined_query_model.add_subquery(query_model2) elif self.join_type == JoinType.LeftOuterJoin: joined_query_model.add_subquery(query_model1) joined_query_model.add_optional_subquery(query_model2) elif self.join_type == JoinType.RightOuterJoin: joined_query_model.add_subquery(query_model2) joined_query_model.add_optional_subquery(query_model1) else: # outer join joined_query_model.add_unions(query_model1) joined_query_model.add_unions(query_model2) return joined_query_model
def __join_expandable_grouped(self, query_model1, query_model2, expandable_order=1): if self.join_type == JoinType.OuterJoin: # outer join return JoinOperator._outer_join(query_model1, query_model2) elif self.join_type == JoinType.InnerJoin: # add query model 2 as a subquery QueryModel.clean_inner_qm(query_model2) query_model1.add_subquery(query_model2) return query_model1 elif ((expandable_order == 1 and self.join_type == JoinType.LeftOuterJoin) or\ (expandable_order == 2 and self.join_type == JoinType.RightOuterJoin)): # make the subquery optional QueryModel.clean_inner_qm(query_model2) query_model1.add_optional_subquery(query_model2) return query_model1 elif ((expandable_order == 2 and self.join_type == JoinType.LeftOuterJoin) or\ (expandable_order == 1 and self.join_type == JoinType.RightOuterJoin)): # create an outer query and add the main dataset as a subquery and the optional dataset as optional subquery joined_query_model = QueryModel() joined_query_model.prefixes = copy.copy( query_model1.prefixes ) # all prefixes are already in query_model1 joined_query_model.variables = copy.copy( query_model1.variables ) # all prefixes are already in query_model1 joined_query_model.from_clause = copy.copy( query_model1.from_clause) joined_query_model.select_columns = copy.copy( query_model1.select_columns) joined_query_model.offset = query_model1.offset joined_query_model.limit = query_model1.limit joined_query_model.order_clause = copy.copy( query_model1.order_clause) QueryModel.clean_inner_qm(query_model1) QueryModel.clean_inner_qm(query_model2) joined_query_model.add_optional_subquery(query_model1) joined_query_model.add_subquery(query_model2) return joined_query_model else: raise Exception("Undefined case")
def __join_expandable_grouped(self, query_model1, query_model2, expandable_order=1): if self.join_type == JoinType.OuterJoin: # outer join joined_query_model = JoinOperator.__create_outer_quer_model(query_model1, query_model2) return JoinOperator._outer_join(joined_query_model, query_model1, query_model2) elif self.join_type == JoinType.InnerJoin : # add query model 2 as a subquery if expandable_order == 1: query_model1 = JoinOperator.__make_parent(query_model1, query_model2) QueryModel.clean_inner_qm(query_model2) query_model1.add_subquery(query_model2) return query_model1 else: query_model2 = JoinOperator.__make_parent(query_model2, query_model1) QueryModel.clean_inner_qm(query_model1) query_model2.add_subquery(query_model1) return query_model2 elif ((expandable_order == 1 and self.join_type == JoinType.LeftOuterJoin) or\ (expandable_order == 2 and self.join_type == JoinType.RightOuterJoin)): # make query model 2 an optional subquery if expandable_order == 1: query_model1 = JoinOperator.__make_parent(query_model1, query_model2) QueryModel.clean_inner_qm(query_model2) query_model1.add_optional_subquery(query_model2) return query_model1 else: query_model2 = JoinOperator.__make_parent(query_model2, query_model1) QueryModel.clean_inner_qm(query_model1) query_model2.add_optional_subquery(query_model1) return query_model2 elif ((expandable_order == 2 and self.join_type == JoinType.LeftOuterJoin) or\ (expandable_order == 1 and self.join_type == JoinType.RightOuterJoin)): # create an outer query and add the main dataset as a subquery and the optional dataset as optional subquery if expandable_order == 1: expandable_qm, grouped_qm = query_model1, query_model2 else: expandable_qm, grouped_qm = query_model2, query_model1 joined_query_model = JoinOperator.__wrap_in_subquery(expandable_qm) joined_query_model = JoinOperator.__make_parent(joined_query_model, grouped_qm) QueryModel.clean_inner_qm(expandable_qm) QueryModel.clean_inner_qm(grouped_qm) joined_query_model.add_optional_subquery(expandable_qm) joined_query_model.add_subquery(grouped_qm) return joined_query_model else: raise Exception("Undefined case of expandable grouped join")