jubatus_core  0.1.2
Jubatus: Online machine learning framework for distributed environment
Public Types | Public Member Functions | Private Types | Private Member Functions | Private Attributes | Friends | List of all members
jubatus::core::storage::column_table Class Reference

#include <column_table.hpp>

Collaboration diagram for jubatus::core::storage::column_table:
Collaboration graph

Public Types

typedef std::pair< owner, uint64_t > version_t
 

Public Member Functions

template<typename T1 >
bool add (const std::string &key, const owner &o, const T1 &v1)
 
template<typename T1 , typename T2 >
bool add (const std::string &key, const owner &o, const T1 &v1, const T2 &v2)
 
void clear ()
 
 column_table ()
 
bool delete_row (const std::string &target)
 
bool delete_row (uint64_t index)
 
std::string dump_json () const
 
std::pair< bool, uint64_t > exact_match (const std::string &prefix) const
 
bit_vector_columnget_bit_vector_column (size_t column_id)
 
const_bit_vector_columnget_bit_vector_column (size_t column_id) const
 
version_t get_clock (const std::string &target) const
 
version_t get_clock (const uint64_t index) const
 
double_columnget_double_column (size_t column_id)
 
const_double_columnget_double_column (size_t column_id) const
 
float_columnget_float_column (size_t column_id)
 
const_float_columnget_float_column (size_t column_id) const
 
int16_columnget_int16_column (size_t column_id)
 
const_int16_columnget_int16_column (size_t column_id) const
 
int32_columnget_int32_column (size_t column_id)
 
const_int32_columnget_int32_column (size_t column_id) const
 
int64_columnget_int64_column (size_t column_id)
 
const_int64_columnget_int64_column (size_t column_id) const
 
int8_columnget_int8_column (size_t column_id)
 
const_int8_columnget_int8_column (size_t column_id) const
 
std::string get_key (uint64_t key_id) const
 
std::string get_key_nolock (uint64_t key_id) const
 
util::concurrent::rw_mutex & get_mutex () const
 
void get_row (const uint64_t id, framework::packer &pk) const
 
string_columnget_string_column (size_t column_id)
 
const_string_columnget_string_column (size_t column_id) const
 
uint16_columnget_uint16_column (size_t column_id)
 
const_uint16_columnget_uint16_column (size_t column_id) const
 
uint32_columnget_uint32_column (size_t column_id)
 
const_uint32_columnget_uint32_column (size_t column_id) const
 
uint64_columnget_uint64_column (size_t column_id)
 
const_uint64_columnget_uint64_column (size_t column_id) const
 
uint8_columnget_uint8_column (size_t column_id)
 
const_uint8_columnget_uint8_column (size_t column_id) const
 
version_t get_version (uint64_t index) const
 
void init (const std::vector< column_type > &schema)
 
 MSGPACK_DEFINE (keys_, tuples_, versions_, columns_, clock_, index_)
 
void pack (framework::packer &packer) const
 
void scan_clock ()
 
version_t set_row (const msgpack::object &o)
 
uint64_t size () const
 
void unpack (msgpack::object o)
 
template<typename T >
bool update (const std::string &key, const owner &o, size_t column_id, const T &v)
 
bool update_clock (const std::string &target, const owner &o)
 
bool update_clock (const uint64_t index, const owner &o)
 
 ~column_table ()
 

Private Types

typedef jubatus::util::data::unordered_map< std::string, uint64_t > index_table
 

Private Member Functions

void delete_row_ (uint64_t index)
 

Private Attributes

uint64_t clock_
 
std::vector< detail::abstract_columncolumns_
 
index_table index_
 
std::vector< std::string > keys_
 
jubatus::util::concurrent::rw_mutex table_lock_
 
uint64_t tuples_
 
std::vector< version_tversions_
 

Friends

std::ostream & operator<< (std::ostream &os, const column_table &tbl)
 

Detailed Description

Definition at line 55 of file column_table.hpp.

Member Typedef Documentation

typedef jubatus::util::data::unordered_map<std::string, uint64_t> jubatus::core::storage::column_table::index_table
private

Definition at line 56 of file column_table.hpp.

Definition at line 59 of file column_table.hpp.

Constructor & Destructor Documentation

jubatus::core::storage::column_table::column_table ( )
inline

Definition at line 61 of file column_table.hpp.

jubatus::core::storage::column_table::~column_table ( )
inline

Definition at line 64 of file column_table.hpp.

64  {
65  }

Member Function Documentation

template<typename T1 >
bool jubatus::core::storage::column_table::add ( const std::string &  key,
const owner o,
const T1 &  v1 
)
inline

Definition at line 71 of file column_table.hpp.

References clock_, columns_, index_, JUBATUS_ASSERT_EQ, keys_, table_lock_, tuples_, and versions_.

71  {
72  if (columns_.size() != 1) {
73  throw length_unmatch_exception(
74  "tuple's length unmatch, expected " +
75  jubatus::util::lang::lexical_cast<std::string>(tuples_) + " tuples.");
76  }
77  // check already exists
78  jubatus::util::concurrent::scoped_wlock lk(table_lock_);
79  index_table::const_iterator it = index_.find(key);
80  const bool not_found = it == index_.end();
81  if (not_found) {
82  // add tuple
83  keys_.push_back(key);
84  versions_.push_back(std::make_pair(o, clock_));
85  columns_[0].push_back(v1);
86  JUBATUS_ASSERT_EQ(keys_.size(), versions_.size(), "");
87 
88  // make index
89  index_.insert(std::make_pair(key, tuples_));
90  ++tuples_;
91  } else { // key exists
92  const uint64_t index = it->second;
93  versions_[index] = std::make_pair(o, clock_);
94  columns_[0].update(index, v1);
95  }
96  ++clock_;
97  return not_found;
98  }
#define JUBATUS_ASSERT_EQ(a, b, messages)
Definition: assert.hpp:63
std::vector< version_t > versions_
std::vector< std::string > keys_
jubatus::util::concurrent::rw_mutex table_lock_
std::vector< detail::abstract_column > columns_
template<typename T1 , typename T2 >
bool jubatus::core::storage::column_table::add ( const std::string &  key,
const owner o,
const T1 &  v1,
const T2 &  v2 
)
inline

Definition at line 101 of file column_table.hpp.

References clock_, columns_, index_, JUBATUS_ASSERT_EQ, keys_, table_lock_, tuples_, and versions_.

101  {
102  if (columns_.size() != 2) {
103  throw length_unmatch_exception(
104  "tuple's length unmatch, expected " +
105  jubatus::util::lang::lexical_cast<std::string>(tuples_) + " tuples.");
106  }
107 
108  // check already exists */
109  jubatus::util::concurrent::scoped_wlock lk(table_lock_);
110  index_table::const_iterator it = index_.find(key);
111  const bool not_found = it == index_.end();
112  if (not_found) {
113  // add tuple
114  keys_.push_back(key);
115  versions_.push_back(std::make_pair(o , clock_));
116  columns_[0].push_back(v1);
117  columns_[1].push_back(v2);
118  JUBATUS_ASSERT_EQ(keys_.size(), versions_.size(), "");
119 
120  // make index
121  index_.insert(std::make_pair(key, tuples_));
122  ++tuples_;
123  } else { // key exists
124  const uint64_t index = it->second;
125  versions_[index] = std::make_pair(o, clock_);
126  columns_[0].update(index, v1);
127  columns_[1].update(index, v2);
128  }
129  ++clock_;
130  return not_found;
131  }
#define JUBATUS_ASSERT_EQ(a, b, messages)
Definition: assert.hpp:63
std::vector< version_t > versions_
std::vector< std::string > keys_
jubatus::util::concurrent::rw_mutex table_lock_
std::vector< detail::abstract_column > columns_
void jubatus::core::storage::column_table::clear ( )

Definition at line 47 of file column_table.cpp.

References clock_, columns_, index_, keys_, table_lock_, tuples_, and versions_.

47  {
48  jutil::concurrent::scoped_wlock lk(table_lock_);
49  // it keeps schema
50  keys_.clear();
51  versions_.clear();
52  for (size_t i = 0; i < columns_.size(); ++i) {
53  columns_[i].clear();
54  }
55  tuples_ = 0;
56  clock_ = 0;
57  index_.clear();
58 }
std::vector< version_t > versions_
std::vector< std::string > keys_
jubatus::util::concurrent::rw_mutex table_lock_
std::vector< detail::abstract_column > columns_
bool jubatus::core::storage::column_table::delete_row ( const std::string &  target)
inline

Definition at line 345 of file column_table.hpp.

References delete_row_(), index_, and table_lock_.

345  {
346  jubatus::util::concurrent::scoped_wlock lk(table_lock_);
347  index_table::const_iterator it = index_.find(target);
348  if (it == index_.end()) {
349  return false;
350  }
351  delete_row_(it->second);
352  return true;
353  }
jubatus::util::concurrent::rw_mutex table_lock_

Here is the call graph for this function:

bool jubatus::core::storage::column_table::delete_row ( uint64_t  index)
inline

Definition at line 355 of file column_table.hpp.

References delete_row_(), size(), and table_lock_.

355  {
356  jubatus::util::concurrent::scoped_wlock lk(table_lock_);
357  if (size() <= index) {
358  return false;
359  }
360  delete_row_(index);
361  return true;
362  }
jubatus::util::concurrent::rw_mutex table_lock_

Here is the call graph for this function:

void jubatus::core::storage::column_table::delete_row_ ( uint64_t  index)
inlineprivate

Definition at line 387 of file column_table.hpp.

References clock_, JUBATUS_ASSERT_EQ, JUBATUS_ASSERT_LT, size(), jubatus::core::clustering::swap(), and tuples_.

Referenced by delete_row().

387  {
388  JUBATUS_ASSERT_LT(index, size(), "");
389 
390  for (std::vector<detail::abstract_column>::iterator jt = columns_.begin();
391  jt != columns_.end();
392  ++jt) {
393  jt->remove(index);
394  }
395  { // needs swap on last index
396  index_table::iterator move_it = index_.find(keys_[tuples_ - 1]);
397  move_it->second = index;
398  index_.erase(keys_[index]);
399  }
400 
401  if (index + 1 != keys_.size()) {
402  std::swap(keys_[index], keys_.back());
403  }
404  keys_.pop_back();
405 
406  if (index + 1 != versions_.size()) {
407  std::swap(versions_[index], versions_.back());
408  }
409  versions_.pop_back();
410 
411  --tuples_;
412  ++clock_;
413 
414  JUBATUS_ASSERT_EQ(tuples_, index_.size(), "");
415  JUBATUS_ASSERT_EQ(tuples_, keys_.size(), "");
416  JUBATUS_ASSERT_EQ(tuples_, versions_.size(), "");
417  }
#define JUBATUS_ASSERT_EQ(a, b, messages)
Definition: assert.hpp:63
std::vector< version_t > versions_
void swap(weighted_point &p1, weighted_point &p2)
Definition: types.hpp:47
std::vector< std::string > keys_
std::vector< detail::abstract_column > columns_
#define JUBATUS_ASSERT_LT(a, b, messages)
Definition: assert.hpp:69

Here is the call graph for this function:

Here is the caller graph for this function:

std::string jubatus::core::storage::column_table::dump_json ( ) const
inline

Definition at line 210 of file column_table.hpp.

References table_lock_, and tuples_.

210  {
211  jubatus::util::concurrent::scoped_rlock lk(table_lock_);
212  std::stringstream ss;
213  ss << tuples_;
214  return ss.str();
215  }
jubatus::util::concurrent::rw_mutex table_lock_
std::pair< bool, uint64_t > jubatus::core::storage::column_table::exact_match ( const std::string &  prefix) const

Definition at line 60 of file column_table.cpp.

References index_, and table_lock_.

61  {
62  jutil::concurrent::scoped_rlock lk(table_lock_);
63  index_table::const_iterator it = index_.find(prefix);
64  if (it == index_.end()) {
65  return std::make_pair(false, 0LLU);
66  } else {
67  return std::make_pair(true, it->second);
68  }
69 }
jubatus::util::concurrent::rw_mutex table_lock_
bit_vector_column & jubatus::core::storage::column_table::get_bit_vector_column ( size_t  column_id)

Definition at line 159 of file column_table.cpp.

References jubatus::core::storage::column_type::bit_vector_type, columns_, and JUBATUS_ASSERT.

159  {
161  return *static_cast<bit_vector_column*>(columns_[column_id].get());
162 }
#define JUBATUS_ASSERT(expr)
Definition: assert.hpp:55
typed_column< bit_vector > bit_vector_column
std::vector< detail::abstract_column > columns_
const_bit_vector_column & jubatus::core::storage::column_table::get_bit_vector_column ( size_t  column_id) const

Definition at line 163 of file column_table.cpp.

References jubatus::core::storage::column_type::bit_vector_type, columns_, and JUBATUS_ASSERT.

164  {
166  return *static_cast<const_bit_vector_column*>(columns_[column_id].get());
167 }
const bit_vector_column const_bit_vector_column
#define JUBATUS_ASSERT(expr)
Definition: assert.hpp:55
std::vector< detail::abstract_column > columns_
version_t jubatus::core::storage::column_table::get_clock ( const std::string &  target) const
inline

Definition at line 328 of file column_table.hpp.

References index_, table_lock_, and versions_.

328  {
329  jubatus::util::concurrent::scoped_rlock lk(table_lock_);
330  index_table::const_iterator it = index_.find(target);
331  if (it == index_.end()) {
332  return version_t();
333  }
334  return versions_[it->second];
335  }
std::vector< version_t > versions_
std::pair< owner, uint64_t > version_t
jubatus::util::concurrent::rw_mutex table_lock_
version_t jubatus::core::storage::column_table::get_clock ( const uint64_t  index) const
inline

Definition at line 337 of file column_table.hpp.

References size(), table_lock_, and versions_.

337  {
338  jubatus::util::concurrent::scoped_rlock lk(table_lock_);
339  if (size() < index) {
340  return version_t();
341  }
342  return versions_[index];
343  }
std::vector< version_t > versions_
std::pair< owner, uint64_t > version_t
jubatus::util::concurrent::rw_mutex table_lock_

Here is the call graph for this function:

double_column & jubatus::core::storage::column_table::get_double_column ( size_t  column_id)

Definition at line 143 of file column_table.cpp.

References columns_, jubatus::core::storage::column_type::double_type, and JUBATUS_ASSERT.

143  {
144  JUBATUS_ASSERT(columns_[column_id].type().is(column_type::double_type));
145  return *static_cast<double_column*>(columns_[column_id].get());
146 }
#define JUBATUS_ASSERT(expr)
Definition: assert.hpp:55
typed_column< double > double_column
std::vector< detail::abstract_column > columns_
const_double_column & jubatus::core::storage::column_table::get_double_column ( size_t  column_id) const

Definition at line 147 of file column_table.cpp.

References columns_, jubatus::core::storage::column_type::double_type, and JUBATUS_ASSERT.

147  {
148  JUBATUS_ASSERT(columns_[column_id].type().is(column_type::double_type));
149  return *static_cast<const_double_column*>(columns_[column_id].get());
150 }
#define JUBATUS_ASSERT(expr)
Definition: assert.hpp:55
const typed_column< double > const_double_column
std::vector< detail::abstract_column > columns_
float_column & jubatus::core::storage::column_table::get_float_column ( size_t  column_id)

Definition at line 135 of file column_table.cpp.

References columns_, jubatus::core::storage::column_type::float_type, and JUBATUS_ASSERT.

135  {
136  JUBATUS_ASSERT(columns_[column_id].type().is(column_type::float_type));
137  return *static_cast<float_column*>(columns_[column_id].get());
138 }
typed_column< float > float_column
#define JUBATUS_ASSERT(expr)
Definition: assert.hpp:55
std::vector< detail::abstract_column > columns_
const_float_column & jubatus::core::storage::column_table::get_float_column ( size_t  column_id) const

Definition at line 139 of file column_table.cpp.

References columns_, jubatus::core::storage::column_type::float_type, and JUBATUS_ASSERT.

139  {
140  JUBATUS_ASSERT(columns_[column_id].type().is(column_type::float_type));
141  return *static_cast<const_float_column*>(columns_[column_id].get());
142 }
#define JUBATUS_ASSERT(expr)
Definition: assert.hpp:55
std::vector< detail::abstract_column > columns_
const typed_column< float > const_float_column
int16_column & jubatus::core::storage::column_table::get_int16_column ( size_t  column_id)

Definition at line 111 of file column_table.cpp.

References columns_, jubatus::core::storage::column_type::int16_type, and JUBATUS_ASSERT.

111  {
112  JUBATUS_ASSERT(columns_[column_id].type().is(column_type::int16_type));
113  return *static_cast<int16_column*>(columns_[column_id].get());
114 }
#define JUBATUS_ASSERT(expr)
Definition: assert.hpp:55
typed_column< int16_t > int16_column
std::vector< detail::abstract_column > columns_
const_int16_column & jubatus::core::storage::column_table::get_int16_column ( size_t  column_id) const

Definition at line 115 of file column_table.cpp.

References columns_, jubatus::core::storage::column_type::int16_type, and JUBATUS_ASSERT.

115  {
116  JUBATUS_ASSERT(columns_[column_id].type().is(column_type::int16_type));
117  return *static_cast<const_int16_column*>(columns_[column_id].get());
118 }
const typed_column< int16_t > const_int16_column
#define JUBATUS_ASSERT(expr)
Definition: assert.hpp:55
std::vector< detail::abstract_column > columns_
int32_column & jubatus::core::storage::column_table::get_int32_column ( size_t  column_id)

Definition at line 119 of file column_table.cpp.

References columns_, jubatus::core::storage::column_type::int32_type, and JUBATUS_ASSERT.

119  {
120  JUBATUS_ASSERT(columns_[column_id].type().is(column_type::int32_type));
121  return *static_cast<int32_column*>(columns_[column_id].get());
122 }
typed_column< int32_t > int32_column
#define JUBATUS_ASSERT(expr)
Definition: assert.hpp:55
std::vector< detail::abstract_column > columns_
const_int32_column & jubatus::core::storage::column_table::get_int32_column ( size_t  column_id) const

Definition at line 123 of file column_table.cpp.

References columns_, jubatus::core::storage::column_type::int32_type, and JUBATUS_ASSERT.

123  {
124  JUBATUS_ASSERT(columns_[column_id].type().is(column_type::int32_type));
125  return *static_cast<const_int32_column*>(columns_[column_id].get());
126 }
#define JUBATUS_ASSERT(expr)
Definition: assert.hpp:55
const typed_column< int32_t > const_int32_column
std::vector< detail::abstract_column > columns_
int64_column & jubatus::core::storage::column_table::get_int64_column ( size_t  column_id)

Definition at line 127 of file column_table.cpp.

References columns_, jubatus::core::storage::column_type::int64_type, and JUBATUS_ASSERT.

127  {
128  JUBATUS_ASSERT(columns_[column_id].type().is(column_type::int64_type));
129  return *static_cast<int64_column*>(columns_[column_id].get());
130 }
typed_column< int64_t > int64_column
#define JUBATUS_ASSERT(expr)
Definition: assert.hpp:55
std::vector< detail::abstract_column > columns_
const_int64_column & jubatus::core::storage::column_table::get_int64_column ( size_t  column_id) const

Definition at line 131 of file column_table.cpp.

References columns_, jubatus::core::storage::column_type::int64_type, and JUBATUS_ASSERT.

131  {
132  JUBATUS_ASSERT(columns_[column_id].type().is(column_type::int64_type));
133  return *static_cast<const_int64_column*>(columns_[column_id].get());
134 }
const typed_column< int64_t > const_int64_column
#define JUBATUS_ASSERT(expr)
Definition: assert.hpp:55
std::vector< detail::abstract_column > columns_
int8_column & jubatus::core::storage::column_table::get_int8_column ( size_t  column_id)

Definition at line 103 of file column_table.cpp.

References columns_, jubatus::core::storage::column_type::int8_type, and JUBATUS_ASSERT.

103  {
104  JUBATUS_ASSERT(columns_[column_id].type().is(column_type::int8_type));
105  return *static_cast<int8_column*>(columns_[column_id].get());
106 }
#define JUBATUS_ASSERT(expr)
Definition: assert.hpp:55
std::vector< detail::abstract_column > columns_
typed_column< int8_t > int8_column
const_int8_column & jubatus::core::storage::column_table::get_int8_column ( size_t  column_id) const

Definition at line 107 of file column_table.cpp.

References columns_, jubatus::core::storage::column_type::int8_type, and JUBATUS_ASSERT.

107  {
108  JUBATUS_ASSERT(columns_[column_id].type().is(column_type::int8_type));
109  return *static_cast<const_int8_column*>(columns_[column_id].get());
110 }
const typed_column< int8_t > const_int8_column
#define JUBATUS_ASSERT(expr)
Definition: assert.hpp:55
std::vector< detail::abstract_column > columns_
std::string jubatus::core::storage::column_table::get_key ( uint64_t  key_id) const
inline

Definition at line 152 of file column_table.hpp.

References get_key_nolock(), and table_lock_.

152  {
153  jubatus::util::concurrent::scoped_rlock lk(table_lock_);
154  return get_key_nolock(key_id);
155  }
std::string get_key_nolock(uint64_t key_id) const
jubatus::util::concurrent::rw_mutex table_lock_

Here is the call graph for this function:

std::string jubatus::core::storage::column_table::get_key_nolock ( uint64_t  key_id) const
inline

Definition at line 157 of file column_table.hpp.

References keys_, and tuples_.

Referenced by get_key().

157  {
158  if (tuples_ <= key_id) {
159  return "";
160  }
161  return keys_[key_id];
162  }
std::vector< std::string > keys_

Here is the caller graph for this function:

util::concurrent::rw_mutex& jubatus::core::storage::column_table::get_mutex ( ) const
inline

Definition at line 364 of file column_table.hpp.

References table_lock_.

364  {
365  return table_lock_;
366  }
jubatus::util::concurrent::rw_mutex table_lock_
void jubatus::core::storage::column_table::get_row ( const uint64_t  id,
framework::packer pk 
) const
inline

Definition at line 244 of file column_table.hpp.

References columns_, JUBATUS_ASSERT_GE, keys_, table_lock_, tuples_, and versions_.

244  {
245  jubatus::util::concurrent::scoped_rlock lk(table_lock_);
246  JUBATUS_ASSERT_GE(tuples_, id, "specified index is bigger than table size");
247  pk.pack_array(3); // [key, [owner, id], [data]]
248  pk.pack(keys_[id]); // key
249  pk.pack(versions_[id]); // [version]
250  pk.pack_array(columns_.size());
251  for (size_t i = 0; i < columns_.size(); ++i) {
252  columns_[i].pack_with_index(id, pk);
253  }
254  }
#define JUBATUS_ASSERT_GE(a, b, messages)
Definition: assert.hpp:71
std::vector< version_t > versions_
std::vector< std::string > keys_
jubatus::util::concurrent::rw_mutex table_lock_
std::vector< detail::abstract_column > columns_
string_column & jubatus::core::storage::column_table::get_string_column ( size_t  column_id)

Definition at line 151 of file column_table.cpp.

References columns_, JUBATUS_ASSERT, and jubatus::core::storage::column_type::string_type.

151  {
152  JUBATUS_ASSERT(columns_[column_id].type().is(column_type::string_type));
153  return *static_cast<string_column*>(columns_[column_id].get());
154 }
typed_column< std::string > string_column
#define JUBATUS_ASSERT(expr)
Definition: assert.hpp:55
std::vector< detail::abstract_column > columns_
const_string_column & jubatus::core::storage::column_table::get_string_column ( size_t  column_id) const

Definition at line 155 of file column_table.cpp.

References columns_, JUBATUS_ASSERT, and jubatus::core::storage::column_type::string_type.

155  {
156  JUBATUS_ASSERT(columns_[column_id].type().is(column_type::string_type));
157  return *static_cast<const_string_column*>(columns_[column_id].get());
158 }
#define JUBATUS_ASSERT(expr)
Definition: assert.hpp:55
const typed_column< std::string > const_string_column
std::vector< detail::abstract_column > columns_
uint16_column & jubatus::core::storage::column_table::get_uint16_column ( size_t  column_id)

Definition at line 79 of file column_table.cpp.

References columns_, JUBATUS_ASSERT, and jubatus::core::storage::column_type::uint16_type.

79  {
80  JUBATUS_ASSERT(columns_[column_id].type().is(column_type::uint16_type));
81  return *static_cast<uint16_column*>(columns_[column_id].get());
82 }
typed_column< uint16_t > uint16_column
#define JUBATUS_ASSERT(expr)
Definition: assert.hpp:55
std::vector< detail::abstract_column > columns_
const_uint16_column & jubatus::core::storage::column_table::get_uint16_column ( size_t  column_id) const

Definition at line 83 of file column_table.cpp.

References columns_, JUBATUS_ASSERT, and jubatus::core::storage::column_type::uint16_type.

83  {
84  JUBATUS_ASSERT(columns_[column_id].type().is(column_type::uint16_type));
85  return *static_cast<const uint16_column*>(columns_[column_id].get());
86 }
typed_column< uint16_t > uint16_column
#define JUBATUS_ASSERT(expr)
Definition: assert.hpp:55
std::vector< detail::abstract_column > columns_
uint32_column & jubatus::core::storage::column_table::get_uint32_column ( size_t  column_id)

Definition at line 87 of file column_table.cpp.

References columns_, JUBATUS_ASSERT, and jubatus::core::storage::column_type::uint32_type.

87  {
88  JUBATUS_ASSERT(columns_[column_id].type().is(column_type::uint32_type));
89  return *static_cast<uint32_column*>(columns_[column_id].get());
90 }
typed_column< uint32_t > uint32_column
#define JUBATUS_ASSERT(expr)
Definition: assert.hpp:55
std::vector< detail::abstract_column > columns_
const_uint32_column & jubatus::core::storage::column_table::get_uint32_column ( size_t  column_id) const

Definition at line 91 of file column_table.cpp.

References columns_, JUBATUS_ASSERT, and jubatus::core::storage::column_type::uint32_type.

91  {
92  JUBATUS_ASSERT(columns_[column_id].type().is(column_type::uint32_type));
93  return *static_cast<const_uint32_column*>(columns_[column_id].get());
94 }
#define JUBATUS_ASSERT(expr)
Definition: assert.hpp:55
const typed_column< uint32_t > const_uint32_column
std::vector< detail::abstract_column > columns_
uint64_column & jubatus::core::storage::column_table::get_uint64_column ( size_t  column_id)

Definition at line 95 of file column_table.cpp.

References columns_, JUBATUS_ASSERT, and jubatus::core::storage::column_type::uint64_type.

95  {
96  JUBATUS_ASSERT(columns_[column_id].type().is(column_type::uint64_type));
97  return *static_cast<uint64_column*>(columns_[column_id].get());
98 }
#define JUBATUS_ASSERT(expr)
Definition: assert.hpp:55
typed_column< uint64_t > uint64_column
std::vector< detail::abstract_column > columns_
const_uint64_column & jubatus::core::storage::column_table::get_uint64_column ( size_t  column_id) const

Definition at line 99 of file column_table.cpp.

References columns_, JUBATUS_ASSERT, and jubatus::core::storage::column_type::uint64_type.

99  {
100  JUBATUS_ASSERT(columns_[column_id].type().is(column_type::uint64_type));
101  return *static_cast<const_uint64_column*>(columns_[column_id].get());
102 }
const typed_column< uint64_t > const_uint64_column
#define JUBATUS_ASSERT(expr)
Definition: assert.hpp:55
std::vector< detail::abstract_column > columns_
uint8_column & jubatus::core::storage::column_table::get_uint8_column ( size_t  column_id)

Definition at line 71 of file column_table.cpp.

References columns_, JUBATUS_ASSERT, and jubatus::core::storage::column_type::uint8_type.

71  {
72  JUBATUS_ASSERT(columns_[column_id].type().is(column_type::uint8_type));
73  return *static_cast<uint8_column*>(columns_[column_id].get());
74 }
#define JUBATUS_ASSERT(expr)
Definition: assert.hpp:55
typed_column< uint8_t > uint8_column
std::vector< detail::abstract_column > columns_
const_uint8_column & jubatus::core::storage::column_table::get_uint8_column ( size_t  column_id) const

Definition at line 75 of file column_table.cpp.

References columns_, JUBATUS_ASSERT, and jubatus::core::storage::column_type::uint8_type.

75  {
76  JUBATUS_ASSERT(columns_[column_id].type().is(column_type::uint8_type));
77  return *static_cast<const uint8_column*>(columns_[column_id].get());
78 }
#define JUBATUS_ASSERT(expr)
Definition: assert.hpp:55
typed_column< uint8_t > uint8_column
std::vector< detail::abstract_column > columns_
version_t jubatus::core::storage::column_table::get_version ( uint64_t  index) const
inline

Definition at line 239 of file column_table.hpp.

References table_lock_, and versions_.

239  {
240  jubatus::util::concurrent::scoped_rlock lk(table_lock_);
241  return versions_[index];
242  }
std::vector< version_t > versions_
jubatus::util::concurrent::rw_mutex table_lock_
void jubatus::core::storage::column_table::init ( const std::vector< column_type > &  schema)

Definition at line 32 of file column_table.cpp.

References columns_, and table_lock_.

32  {
33  jutil::concurrent::scoped_wlock lk(table_lock_);
34  /* defining tuple */
35  if (!columns_.empty()) {
36  throw storage_exception(
37  "Storage's schemas cannot be over written. Clear schemas before "
38  "init()");
39  }
40  for (std::vector<column_type>::const_iterator it = schema.begin();
41  it != schema.end();
42  ++it) {
43  columns_.push_back(detail::abstract_column(*it));
44  }
45 }
jubatus::util::concurrent::rw_mutex table_lock_
std::vector< detail::abstract_column > columns_
jubatus::core::storage::column_table::MSGPACK_DEFINE ( keys_  ,
tuples_  ,
versions_  ,
columns_  ,
clock_  ,
index_   
)
void jubatus::core::storage::column_table::pack ( framework::packer packer) const
inline

Definition at line 370 of file column_table.hpp.

370  {
371  packer.pack(*this);
372  }
msgpack::packer< jubatus_packer > packer
Definition: bandit_base.hpp:31
void jubatus::core::storage::column_table::scan_clock ( )
inline

Definition at line 164 of file column_table.hpp.

References clock_, table_lock_, and versions_.

164  {
165  jubatus::util::concurrent::scoped_wlock lk(table_lock_);
166  uint64_t max_clock = 0;
167  for (std::vector<version_t>::const_iterator it = versions_.begin();
168  it != versions_.end(); ++it) {
169  max_clock = std::max(max_clock, it->second);
170  }
171  clock_ = max_clock;
172  }
std::vector< version_t > versions_
jubatus::util::concurrent::rw_mutex table_lock_
version_t jubatus::core::storage::column_table::set_row ( const msgpack::object &  o)
inline

Definition at line 256 of file column_table.hpp.

References clock_, columns_, index_, JUBATUS_ASSERT_EQ, keys_, table_lock_, tuples_, and versions_.

256  {
257  if (o.type != msgpack::type::ARRAY || o.via.array.size != 3) {
258  throw msgpack::type_error();
259  }
260 
261  const std::string& key = o.via.array.ptr[0].as<std::string>();
262  version_t set_version = o.via.array.ptr[1].as<version_t>();
263 
264  jubatus::util::concurrent::scoped_wlock lk(table_lock_);
265  const msgpack::object& dat = o.via.array.ptr[2];
266  index_table::iterator it = index_.find(key);
267  if (it == index_.end()) { // did not exist, append
268  if (dat.via.array.size != columns_.size()) {
269  throw std::bad_cast();
270  }
271 
272  // add tuple
273  keys_.push_back(key);
274  versions_.push_back(set_version);
275  for (size_t i = 0; i < columns_.size(); ++i) {
276  columns_[i].push_back(dat.via.array.ptr[i]);
277  }
278  JUBATUS_ASSERT_EQ(keys_.size(), versions_.size(), "");
279 
280  // make index
281  index_.insert(std::make_pair(key, tuples_));
282  ++tuples_;
283  } else { // already exist, overwrite if needed
284  const uint64_t target = it->second;
285 
286  if (dat.via.array.size != columns_.size()) {
287  throw std::bad_cast();
288  }
289 
290  // overwrite tuple if needed
291  if (versions_[target].second <= set_version.second) {
292  // needed!!
293  versions_[target] = set_version;
294  for (size_t i = 0; i < columns_.size(); ++i) {
295  columns_[i].update(target, dat.via.array.ptr[i]);
296  }
297  // make index
298  index_.insert(std::make_pair(key, tuples_));
299  }
300  }
301  if (clock_ <= set_version.second) {
302  clock_ = set_version.second + 1;
303  }
304  return set_version;
305  }
#define JUBATUS_ASSERT_EQ(a, b, messages)
Definition: assert.hpp:63
std::vector< version_t > versions_
std::vector< std::string > keys_
jubatus::core::storage::column_table::version_t version_t
jubatus::util::concurrent::rw_mutex table_lock_
std::vector< detail::abstract_column > columns_
uint64_t jubatus::core::storage::column_table::size ( ) const
inline

Definition at line 205 of file column_table.hpp.

References table_lock_, and tuples_.

Referenced by delete_row(), delete_row_(), get_clock(), and update_clock().

205  {
206  jubatus::util::concurrent::scoped_rlock lk(table_lock_);
207  return tuples_;
208  }
jubatus::util::concurrent::rw_mutex table_lock_

Here is the caller graph for this function:

void jubatus::core::storage::column_table::unpack ( msgpack::object  o)
inline

Definition at line 374 of file column_table.hpp.

374  {
375  o.convert(this);
376  }
template<typename T >
bool jubatus::core::storage::column_table::update ( const std::string &  key,
const owner o,
size_t  column_id,
const T &  v 
)
inline

Definition at line 135 of file column_table.hpp.

References clock_, columns_, index_, table_lock_, tuples_, and versions_.

139  {
140  jubatus::util::concurrent::scoped_wlock lk(table_lock_);
141  index_table::iterator it = index_.find(key);
142  if (tuples_ < column_id || it == index_.end()) {
143  return false;
144  }
145  versions_[it->second] = std::make_pair(o, clock_);
146  columns_[column_id].update(it->second, v);
147  columns_[column_id].update(it->second, v);
148  ++clock_;
149  return true;
150  }
std::vector< version_t > versions_
std::vector< T > v(size)
jubatus::util::concurrent::rw_mutex table_lock_
std::vector< detail::abstract_column > columns_
bool jubatus::core::storage::column_table::update_clock ( const std::string &  target,
const owner o 
)
inline

Definition at line 307 of file column_table.hpp.

References clock_, index_, table_lock_, and versions_.

307  {
308  jubatus::util::concurrent::scoped_wlock lk(table_lock_);
309  index_table::const_iterator it = index_.find(target);
310  if (it == index_.end()) {
311  return false;
312  }
313  versions_[it->second] = std::make_pair(o, clock_);
314  ++clock_;
315  return true;
316  }
std::vector< version_t > versions_
jubatus::util::concurrent::rw_mutex table_lock_
bool jubatus::core::storage::column_table::update_clock ( const uint64_t  index,
const owner o 
)
inline

Definition at line 318 of file column_table.hpp.

References clock_, size(), table_lock_, and versions_.

318  {
319  jubatus::util::concurrent::scoped_wlock lk(table_lock_);
320  if (size() < index) {
321  return false;
322  }
323  versions_[index] = std::make_pair(o, clock_);
324  ++clock_;
325  return true;
326  }
std::vector< version_t > versions_
jubatus::util::concurrent::rw_mutex table_lock_

Here is the call graph for this function:

Friends And Related Function Documentation

std::ostream& operator<< ( std::ostream &  os,
const column_table tbl 
)
friend

Definition at line 219 of file column_table.hpp.

219  {
220  jubatus::util::concurrent::scoped_rlock lk(tbl.table_lock_);
221  os << "total size:" << tbl.tuples_ << std::endl;
222  os << "types: vesions|";
223  for (size_t j = 0; j < tbl.columns_.size(); ++j) {
224  os << tbl.columns_[j].type().type_as_string() << "\t|";
225  }
226  os << std::endl;
227  for (uint64_t i = 0; i < tbl.tuples_; ++i) {
228  os << tbl.keys_[i] << ":" <<
229  tbl.versions_[i].first << ":" << tbl.versions_[i].second << "\t|";
230  for (size_t j = 0; j < tbl.columns_.size(); ++j) {
231  tbl.columns_[j].dump(os, i);
232  os << "\t|";
233  }
234  os << std::endl;
235  }
236  return os;
237  }

Member Data Documentation

uint64_t jubatus::core::storage::column_table::clock_
private

Definition at line 384 of file column_table.hpp.

Referenced by add(), clear(), delete_row_(), scan_clock(), set_row(), update(), and update_clock().

std::vector<detail::abstract_column> jubatus::core::storage::column_table::columns_
private
index_table jubatus::core::storage::column_table::index_
private
std::vector<std::string> jubatus::core::storage::column_table::keys_
private

Definition at line 379 of file column_table.hpp.

Referenced by add(), clear(), get_key_nolock(), get_row(), and set_row().

jubatus::util::concurrent::rw_mutex jubatus::core::storage::column_table::table_lock_
mutableprivate
uint64_t jubatus::core::storage::column_table::tuples_
private
std::vector<version_t> jubatus::core::storage::column_table::versions_
private

The documentation for this class was generated from the following files: