Drizzled Public API Documentation

nested_join.h
1 /* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2  * vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
3  *
4  * Copyright (C) 2008 Sun Microsystems, Inc.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; version 2 of the License.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18  */
19 
20 #pragma once
21 
22 #include <drizzled/item.h>
23 #include <drizzled/lex_string.h>
24 #include <drizzled/sql_list.h>
25 
26 #include <bitset>
27 
28 namespace drizzled {
29 
31 {
32 public:
33  /*
34  This constructor serves for creation of NestedJoin instances
35  */
36  NestedJoin()
37  :
38  join_list(),
39  used_tables(),
40  not_null_tables(),
41  first_nested(NULL),
42  counter_(0),
43  nj_map(),
44  sj_depends_on(),
45  sj_corr_tables(),
46  sj_outer_expr_list()
47  { }
48 
49  /* list of elements in the nested join */
50  List<TableList> join_list;
51 
52  /* bitmap of tables in the nested join */
53  table_map used_tables;
54 
55  /* tables that rejects nulls */
56  table_map not_null_tables;
57 
58  /* the first nested table in the plan */
59  JoinTable *first_nested;
60 
61  /*
62  Used to count tables in the nested join in 2 isolated places:
63  1. In make_outerjoin_info().
64  2. check_interleaving_with_nj/restore_prev_nj_state (these are called
65  by the join optimizer.
66  Before each use the counters are zeroed by reset_nj_counters.
67  */
68 
69  uint32_t counter_;
70 
71  /* Bit used to identify this nested join*/
72  std::bitset<64> nj_map;
73 
74  /*
75  True if this join nest node is completely covered by the query execution
76  plan. This means two things.
77 
78  1. All tables on its @c join_list are covered by the plan.
79 
80  2. All child join nest nodes are fully covered.
81  */
82 
83  bool is_fully_covered() const { return join_list.size() == counter_; }
84 
85  /* To get the table_map sj_depends_on */
86  table_map getSjDependsOn() const
87  {
88  return sj_depends_on;
89  }
90 
91  /* To set the table_map sj_depends_on */
92  void setSjDependsOn(const table_map &in_sj_depends_on)
93  {
94  sj_depends_on= in_sj_depends_on;
95  }
96 
97  /* To get the table_map sj_corr_tables */
98  table_map getSjCorrTables() const
99  {
100  return sj_corr_tables;
101  }
102 
103  /* To set the table_map sj_corr_tables */
104  void setSjCorrTables(const table_map &in_sj_corr_tables)
105  {
106  sj_corr_tables= in_sj_corr_tables;
107  }
108 
109  /* To get the List sj_outer_expr_list */
110  const List<Item>& getSjOuterExprList() const
111  {
112  return sj_outer_expr_list;
113  }
114 
115  /* To set the List sj_outer_expr_list */
116  void setSjOuterExprList(const List<Item> &in_sj_outer_expr_list)
117  {
118  sj_outer_expr_list= in_sj_outer_expr_list;
119  }
120 
121 private:
122  /*
123  (Valid only for semi-join nests) Bitmap of tables outside the semi-join
124  that are used within the semi-join's ON condition.
125  */
126  table_map sj_depends_on;
127 
128  /* Outer non-trivially correlated tables */
129  table_map sj_corr_tables;
130 
131  List<Item> sj_outer_expr_list;
132 
133 };
134 
135 } /* namespace drizzled */
136