OoOJoin  0.0.1
The next generation of out-of-order join operator
StateOfKey.h
Go to the documentation of this file.
1 
2 //
3 // Created by tony on 02/12/22.
4 //
5 
6 #ifndef INTELLISTREAM_STATEOFKEY_H
7 #define INTELLISTREAM_STATEOFKEY_H
8 #include <stdint.h>
9 #include <string>
10 #include <memory>
11 #include <Common/Tuples.h>
12 #include <vector>
13 namespace OoOJoin {
14 
29  public:
31 
32  }
33  ~AbstractStateOfKey() {}
34  keyType key = 0;
35 };
40 typedef std::shared_ptr<class AbstractStateOfKey> AbstractStateOfKeyPtr;
41 class StateOfKeyBucket;
46 typedef std::shared_ptr<class StateOfKeyBucket> StateOfKeyBucketPtr;
53  private:
54  std::mutex m_mut;
55  //vector<NPJTuplePtr>tuples;
56  size_t bucketSize;
62  class StateOfKeyBucket_Iterator {
63  private:
64  AbstractStateOfKeyPtr cellPtr = nullptr;
65  StateOfKeyBucket *bucketPtr = nullptr;
66  size_t bucketPos = 0;
67  public:
68  StateOfKeyBucket_Iterator(AbstractStateOfKeyPtr cp = nullptr, StateOfKeyBucket *bp = nullptr, size_t bkpos = 0)
69  : cellPtr(cp), bucketPtr(bp), bucketPos(bkpos) {}
70  AbstractStateOfKeyPtr operator*() const {
71  return cellPtr;
72  }
73 
74  AbstractStateOfKeyPtr first() {
75  return cellPtr;
76  }
77  StateOfKeyBucket *second() {
78  return bucketPtr;
79  }
80  StateOfKeyBucket *operator->() const {
81  return bucketPtr;
82  }
83 
84  bool operator==(const StateOfKeyBucket_Iterator &t) const {
85  return t.cellPtr == this->cellPtr;
86  }
87 
88  bool operator!=(const StateOfKeyBucket_Iterator &t) const {
89  return t.cellPtr != this->cellPtr;
90  }
91  StateOfKeyBucket_Iterator &operator++() {
92  bucketPos++;
93  if (bucketPos == bucketPtr->count) {
94  bucketPtr = bucketPtr->next.get();
95  bucketPos = 0;
96  }
97  if (bucketPtr) {
98  cellPtr = bucketPtr->cells[bucketPos];
99  } else {
100  cellPtr = nullptr;
101  }
102  return *this;
103  }
104  /*StateOfKeyBucket_Iterator operator++(int) {
105  AbstractStateOfKeyPtr tempCell=cellPtr;
106  StateOfKeyBucket *tempBucket=bucketPtr;
107  size_t tempPos=bucketPos;
108  bucketPos++;
109  if(bucketPos==bucketPtr->count){
110  bucketPtr=bucketPtr->next.get();
111  bucketPos=0;
112  }
113  if(bucketPtr) {
114  cellPtr=bucketPtr->cells[bucketPos];
115  } else {
116  cellPtr= nullptr;
117  }
118 
119  return StateOfKeyBucket_Iterator(tempCell,tempBucket,tempPos);
120  }*/
121  };
122  public:
123  typedef StateOfKeyBucket_Iterator iterator;
124  size_t count = 0;
125  std::vector<AbstractStateOfKeyPtr> cells;
126  StateOfKeyBucketPtr next = nullptr;
132  void setCellCount(size_t cnt) {
133  cells = std::vector<AbstractStateOfKeyPtr>(cnt);
134  bucketSize = cnt;
135  }
139  void lock() {
140  while (!m_mut.try_lock());
141  }
145  void unlock() {
146  m_mut.unlock();
147  }
152  void insert(AbstractStateOfKeyPtr ask);
159  iterator begin() {
160  return StateOfKeyBucket_Iterator(cells[0], this, 0);
161  }
162 
163  //返回链表尾部指针
164  iterator end() {
165  return StateOfKeyBucket_Iterator(nullptr, this, 0);
166  }
171  /*MtBucketPtr getNext(){
172  return next;
173  }*/
174 };
181  private:
182 
183  public:
184  keyType hash_mask;
185  keyType skip_bits;
186  std::vector<StateOfKeyBucket> buckets;
193  StateOfKeyHashTable(size_t bks, size_t cells = 4);
194  ~StateOfKeyHashTable() {}
200  void insert(AbstractStateOfKeyPtr ask);
212 
213 };
218 typedef std::shared_ptr<StateOfKeyHashTable> StateOfKeyHashTablePtr;
223 #define newStateOfKeyHashTable std::make_shared<OoOJoin::StateOfKeyHashTable>
230 #define ImproveStateOfKeyTo(n, ru) std::static_pointer_cast<n>(ru)
231 
238 }
239 #endif //INTELLISTREAM_STATEOFKEY_H
The statistics and prediction state of a key.
Definition: StateOfKey.h:28
The multithread-supported bucket of StateOfKey.
Definition: StateOfKey.h:52
void insert(AbstractStateOfKeyPtr ask)
Insert a StateOfKey.
Definition: StateOfKey.cpp:30
AbstractStateOfKeyPtr getByKey(keyType probeKey)
probe if we have something with the same key as ask
Definition: StateOfKey.cpp:54
void lock()
lock this bucket
Definition: StateOfKey.h:139
void unlock()
unlock this bucket
Definition: StateOfKey.h:145
void setCellCount(size_t cnt)
set how many cells are allowed in one bucket
Definition: StateOfKey.h:132
The multithread-supported hash table, holding buckets of stateofkey.
Definition: StateOfKey.h:180
void insertSafe(AbstractStateOfKeyPtr ask)
Insert a StateOfKey, a thread safe version.
Definition: StateOfKey.cpp:82
AbstractStateOfKeyPtr getByKey(keyType probeKey)
probe if we have something with the same key as ask
Definition: StateOfKey.cpp:103
void insert(AbstractStateOfKeyPtr ask)
Insert a StateOfKey.
Definition: StateOfKey.cpp:94
std::shared_ptr< class AbstractStateOfKey > AbstractStateOfKeyPtr
The class to describe a shared pointer to AbstractStateOfKey.
Definition: StateOfKey.h:40
std::shared_ptr< class StateOfKeyBucket > StateOfKeyBucketPtr
The shared pointer to a StateOfKeyBucket.
Definition: StateOfKey.h:46
std::shared_ptr< StateOfKeyHashTable > StateOfKeyHashTablePtr
The shared pointer to a StateOfKeyHashTable.
Definition: StateOfKey.h:218
uint64_t keyType
Definition: Tuples.h:18
Definition: OperatorTable.cpp:7