示例#1
0
 def delete_records(self, criteria: List[db_api.SelectionCriteria]) -> None:
     data = json_func.read_from_json(f"{db_api.DB_ROOT}/db.json")
     num_of_files = data[self.name]["num_of_files"]
     primary_key = data[self.name]["key_field_name"]
     for file in range(num_of_files):
         file_data = json_func.read_from_json(f"{db_api.DB_ROOT}/{self.name}{file + 1}.json")
         keys_to_delete = []
         for key, value in file_data.items():
             flag = 0
             for c in criteria:
                 if c.field_name == primary_key:
                     if key in file_data.keys():
                         if not ops[c.operator](int(key), int(c.value)):
                             flag = 1
                             break
                 elif key in file_data.keys():
                     if not ops[c.operator](int(value[c.field_name]), int(c.value)):
                         flag = 1
                         break
             if not flag:
                 keys_to_delete.append(key)
         for key in keys_to_delete:
             del file_data[key]
             data[self.name]["num_of_lines"] -= 1
             update_delete_indexes(data, self.name, key)
         json_func.write_to_json(f"{db_api.DB_ROOT}/{self.name}{file + 1}.json", file_data)
     json_func.write_to_json(f"{db_api.DB_ROOT}/db.json", data)
示例#2
0
 def get_record(self, key: Any) -> Dict[str, Any]:
     data = json_func.read_from_json(f"{db_api.DB_ROOT}/db.json")
     num_of_files = data[self.name]["num_of_files"]
     for file in range(num_of_files):
         json_data = json_func.read_from_json(f"{db_api.DB_ROOT}/{self.name}{file + 1}.json")
         for k in json_data.keys():
             if k == str(key):
                 return json_data[k]
     raise ValueError
示例#3
0
 def update_record(self, key: Any, values: Dict[str, Any]) -> None:
     data = json_func.read_from_json(f"{db_api.DB_ROOT}/db.json")
     primary_key = data[self.name]["key_field_name"]
     json_path = get_indexes(f'{db_api.DB_ROOT}/{self.name}IndexBy{primary_key}.db', key)
     json_data = json_func.read_from_json(json_path)
     for k in json_data.keys():
         if k == str(key):
             for key, value in values.items():
                 json_data[k][key] = value
                 json_func.write_to_json(json_path, json_data)
                 return None
     raise ValueError
示例#4
0
    def create_index(self, field_to_index: str) -> None:
        index = {}
        data = json_func.read_from_json(f"{db_api.DB_ROOT}/db.json")
        if field_to_index in data[self.name]["indexes"]:
            print("index exist")
            return
        data[self.name]["indexes"].append(field_to_index)
        json_func.write_to_json(f"{db_api.DB_ROOT}/db.json", data)

        num_of_files = data[self.name]["num_of_files"]
        primary_key = data[self.name]["key_field_name"]

        if primary_key == field_to_index:
            for file in range(num_of_files):
                path = f"{db_api.DB_ROOT}/{self.name}{file + 1}.json"
                the_file = open(path)
                json_data = json.load(the_file)
                for k in json_data.keys():
                    index[k] = path
        else:
            for file in range(num_of_files):
                path = f"{db_api.DB_ROOT}/{self.name}{file + 1}.json"
                the_file = open(path)
                json_data = json.load(the_file)
                for v in json_data.values():
                    index[v[field_to_index]] = path
        json_func.write_to_json(f'{db_api.DB_ROOT}/{self.name}IndexBy{field_to_index}.db', index)
示例#5
0
 def insert_record(self, values: Dict[str, Any]) -> None:
     data = json_func.read_from_json(f"{db_api.DB_ROOT}/db.json")
     primary_key = data[self.name]["key_field_name"]
     flag = None
     try:
         flag = self.get_record(values[primary_key])
     except ValueError:
         new_record = {
             values[primary_key]:
             {k: str(v)
              for k, v in values.items() if k != primary_key}
         }
         if data[self.name]["num_of_lines"] % 10 == 0 and data[
                 self.name]["num_of_lines"] != 0:
             data[self.name]["num_of_files"] += 1
             json_func.write_to_json(
                 f"{db_api.DB_ROOT}/{self.name}{data[self.name]['num_of_files']}.json",
                 new_record)
         else:
             json_func.add_line_to_json(
                 f"db_files/{self.name}{data[self.name]['num_of_files']}.json",
                 values[primary_key], new_record[values[primary_key]])
         data[self.name]["num_of_lines"] += 1
         json_func.write_to_json(f"{db_api.DB_ROOT}/db.json", data)
         update_insert_indexes(
             data, self.name, values,
             f"db_files/{self.name}{data[self.name]['num_of_files']}.json")
     if flag is not None:
         raise ValueError
示例#6
0
def update_delete_indexes(data, name, index):
    if index in data[name]["indexes"]:
        json_data = json_func.read_from_json(
            f'{db_api.DB_ROOT}/{name}IndexBy{index}.db')
        del json_data[str(index)]
        json_func.write_to_json(f'{db_api.DB_ROOT}/{name}IndexBy{index}.db',
                                json_data)
示例#7
0
def update_insert_indexes(data, name, values, path):
    for index in data[name]["indexes"]:
        json_data = json_func.read_from_json(
            f'{db_api.DB_ROOT}/{name}IndexBy{index}.db')
        json_data[str(values[index])] = path
        json_func.write_to_json(f'{db_api.DB_ROOT}/{name}IndexBy{index}.db',
                                json_data)
示例#8
0
 def delete_table(self, table_name: str) -> None:
     num_of_files = json_func.delete_table_from_json(table_name)
     for file in range(num_of_files):
         path = f"db_files/{table_name}{file + 1}.json"
         os.remove(path)
     data = json_func.read_from_json(f"db_files/db.json")
     data["num_of_tables"] -= 1
     json_func.write_to_json(f"db_files/db.json",data)
示例#9
0
 def delete_record(self, key: Any) -> None:
     data = json_func.read_from_json(f"{db_api.DB_ROOT}/db.json")
     primary_key = data[self.name]["key_field_name"]
     json_path = get_indexes(f'{db_api.DB_ROOT}/{self.name}IndexBy{primary_key}.db', key)
     flag = json_func.delete_if_apear(json_path, key)
     if flag == 0:
         raise ValueError
     data[self.name]["num_of_lines"] -= 1
     update_delete_indexes(data, self.name, key)
     json_func.write_to_json(f"{db_api.DB_ROOT}/db.json", data)
示例#10
0
 def query_table(self, criteria: List[db_api.SelectionCriteria]) \
         -> List[Dict[str, Any]]:
     data = json_func.read_from_json(f"{db_api.DB_ROOT}/db.json")
     num_of_files = data[self.name]["num_of_files"]
     primary_key = data[self.name]["key_field_name"]
     list_to_return = []
     for file in range(num_of_files):
         file_data = json_func.read_from_json(f"{db_api.DB_ROOT}/{self.name}{file + 1}.json")
         for key, value in file_data.items():
             flag = 0
             for c in criteria:
                 if c.field_name == primary_key:
                     if not ops[c.operator](int(key), int(c.value)):
                         flag = 1
                         break
                 elif not ops[c.operator](value[c.field_name], c.value):
                     flag = 1
                     break
             if not flag:
                 list_to_return.append(value)
     return list_to_return
示例#11
0
    def get_record(self, key: Any) -> Dict[str, Any]:
        db_meta_data = read_db_meta_data()
        num_of_files = db_meta_data[self.name]['num_of_files']

        for file_num in range(num_of_files):
            file_data = read_from_json(
                f"db_files/{self.name}{file_num + 1}.json")

            for k in file_data.keys():
                if k == str(key):
                    return file_data[k]

        raise ValueError
示例#12
0
def del_if_record_appear(path, key):
    file_data = read_from_json(path)
    record_exist = False
    for k in file_data.keys():
        if k == str(key):
            record_exist = True
            del_key = k
            break

    if record_exist:
        del file_data[del_key]
        write_to_json(path, file_data)

    return record_exist
示例#13
0
    def update_record(self, key: Any, values: Dict[str, Any]) -> None:
        db_meta_data = read_db_meta_data()
        num_of_files = db_meta_data[self.name]['num_of_files']
        for file_num in range(num_of_files):
            file_data = read_from_json(
                f"db_files/{self.name}{file_num + 1}.json")
            for k in file_data.keys():
                if k == str(key):
                    for field, val in values.items():
                        file_data[k][field] = val
                    write_to_json(f"db_files/{self.name}{file_num + 1}.json",
                                  file_data)
                    return None

        raise ValueError
示例#14
0
    def query_table(self, criteria: List[SelectionCriteria]) \
            -> List[Dict[str, Any]]:
        db_meta_data = read_db_meta_data()
        num_of_files = db_meta_data[self.name]['num_of_files']
        primary_key = db_meta_data[self.name]['key_field_name']
        records_to_return = []
        for file_num in range(num_of_files):
            file_data = read_from_json(
                f"db_files/{self.name}{file_num + 1}.json")
            for key, value in file_data.items():
                for c in criteria:
                    if c.field_name == primary_key:
                        if not ops[c.operator](int(key), int(c.value)):
                            break

                    elif not ops[c.operator](value[c.field_name], c.value):
                        break
                    records_to_return.append(value)
        return records_to_return
示例#15
0
    def delete_records(self, criteria: List[SelectionCriteria]) -> None:
        db_meta_data = read_db_meta_data()
        num_of_files = db_meta_data[self.name]['num_of_files']
        primary_key = db_meta_data[self.name]['key_field_name']

        for file_num in range(num_of_files):
            keys_to_delete = []
            file_data = read_from_json(
                f"db_files/{self.name}{file_num + 1}.json")

            for key, value in file_data.items():

                if meets_all_the_criteria(file_data, key, value, primary_key,
                                          criteria):
                    keys_to_delete.append(key)

            for key in keys_to_delete:
                del file_data[key]
                db_meta_data[self.name]['num_of_lines'] -= 1

            write_to_json(f"db_files/{self.name}{file_num + 1}.json",
                          file_data)
        update_db_meta_data(db_meta_data)
示例#16
0
def read_db_meta_data():
    return read_from_json("db_files/db.json")
示例#17
0
 def num_tables(self) -> int:
     return json_func.read_from_json("db_files/db.json")["num_of_tables"]
示例#18
0
 def get_table(self, table_name: str) -> DBTable:
     data = json_func.read_from_json("db_files/db.json")[table_name]
     return DBTable(table_name, convert_to_db_fields(data["fields"]), data["key_field_name"])
示例#19
0
 def count(self) -> int:
     return json_func.read_from_json(f"db_files/db.json")[self.name]["num_of_lines"]
示例#20
0
def get_indexes(path, key):
    json_data = json_func.read_from_json(path)
    return json_data[str(key)]
示例#21
0
 def get_tables_names(self) -> List[Any]:
     data = json_func.read_from_json("db_files/db.json")
     return [name for name in data.keys() if name != "num_of_tables"]
示例#22
0
def get_input_and_search(data, trie):
    while 1:
        sentence_for_search = ""
        while 1:
            sentence_for_search += input(
                f"enter your search term . # for new search. * for exit: {sentence_for_search}"
            )
            if sentence_for_search:
                if sentence_for_search[-1] == "#":
                    print("---------type a new search---------")
                    break
                if sentence_for_search[-1] == "*":
                    break
            if auto_complete(trie, data, sentence_for_search) == 0:
                print("---------not found :( type a new search---------")
                break
        if sentence_for_search[-1] == "*":
            break


if __name__ == '__main__':
    """offline:
    data = dict()
    trie = create_db()
    init_tree(trie, data)"""

    trie = read_from_json("trie.json")
    data = read_from_json("data.json")
    get_input_and_search(data, trie)