Cassandra is a NoSQL storage. The structure has two-level keys.

  1. Level 1: raw_key. The same as hash_key or shard_key.
  2. Level 2: column_key.
  3. Level 3: column_value

raw_key is used to hash and can not support range query. let's simplify this to a string.
column_key is sorted and support range query. let's simplify this to integer.
column_value is a string. you can serialize any data into a string and store it in column value.

implement the following methods:

  1. insert(raw_key, column_key, column_value)
  2. query(raw_key, column_start, column_end) // return a list of entries

Have you met this question in a real interview?

Yes

Example

insert("google", 1, "haha")
query("google", 0, 1)

>
>
 [(1, "haha")]
/**
 * Definition of Column:
 * class Column {
 * public:
 *     int key;
 *     String value;
 *     Column(int key, string value) {
 *         this->key = key;
 *         this->value = value;
 *    }
 * }
 */ 
class MiniCassandra {
public:
    MiniCassandra() {
        // initialize your data structure here.
    }

    /**
     * @param raw_key a string
     * @param column_start an integer
     * @param column_end an integer
     * @return void
     */
    void insert(string raw_key, int column_key, string column_value) {
        // Write your code here
        if (hash.find(raw_key) == hash.end()) {
            hash[raw_key] = map<int, string>();
        }
        hash[raw_key][column_key] = column_value;
    }

    /**
     * @param raw_key a string
     * @param column_start an integer
     * @param column_end an integer
     * @return a list of Columns
     */
    vector<Column> query(string raw_key, int column_start, int column_end) {
        // Write your code here
        vector<Column> res;
        if (hash.find(raw_key) == hash.end()) {
            return res;
        }
        auto it = hash[raw_key].lower_bound(column_start);
        for ( ; it != hash[raw_key].end(); ++it) {
            if (it->first > column_end) {
                break;
            }
            res.push_back(Column(it->first, it->second));
        }

        return res;
    }

private:
    map<string, map<int, string>> hash;
};

results matching ""

    No results matching ""