def fetch_ids(self, tree_node):
        key = tree_node.get_right_node().get_value()
        try:
            key = int(key)
        except:
            pass
        var, name = tree_node.get_left_node().get_value().split(".")
        operator = Operator.get_operator(tree_node.get_value())
        find = FindAllIndex(name, key, self._name_type[var], operator, "id")
        res = []
        for client in self._communication_service.get_client_list():
            self.send(client.get_name(), 'IndexService', find)

        for client in self._communication_service.get_client_list():
            source_name, source_service, results = self._queue.get()
            res += results
        return res
    def fetch_query_results(self, expression_node):
        left_value = expression_node.get_left_node().get_value()
        right_value = expression_node.get_right_node().get_value()
        results_ids = []

        if self.is_variable(left_value) and self.is_variable(right_value):
            variable, attribute = right_value.split(".")
            find_all_index = FindAllIndex(attribute, None, self._name_type[variable], None, "id")
            results = []
            if self._name_type[variable] not in self._ids_list.keys():
                for client in self._communication_service.get_client_list():
                    self.send(client.get_name(), 'IndexService', find_all_index)

                for client in self._communication_service.get_client_list():
                    s_name, s_service, res = self._queue.get()
                    results += res
                self._ids_list[self._name_type[variable]] = results
            else:
                results = self._ids_list[self._name_type[variable]]

            for value, id in results:
                new_node = ExpressionTreeNode(expression_node.get_value(), expression_node.get_left_node(), ExpressionTreeNode(value))
                node_ids = self.fetch_ids(new_node)
                key = id
                if variable == self._node_name['node1']:
                    index_name = 'node_id1-id2'
                else:
                    index_name = 'node_id2-id1'
                edge_type = self._name_type[self._node_name['edge']]
                edge_ids = self.get_edge_end_ids(index_name, key, edge_type)

                ids = self.intersection(node_ids, edge_ids)
                for i in ids:
                    if variable == self._node_name['node2']:
                        results_ids.append((i, id))
                    else:
                        results_ids.append((id, i))
            result_set = ResultSet("n1n2", results_ids)
            return result_set

        elif self.is_variable(left_value):
            ids = self.fetch_ids(expression_node)
            variable, attribute = left_value.split(".")
            if variable == self._node_name['node1']:
                type = 'n1'
            else:
                type = 'n2'

            result_set = ResultSet(type, ids)
            return result_set

        elif self.is_variable(right_value):
            new_node = ExpressionTreeNode(Operator.get_opposite(expression_node.get_value()), expression_node.get_right_node(), expression_node.get_left_node())
            ids = self.fetch_ids(new_node)
            variable, attribute = right_value.split(".")
            if variable == self._node_name['node1']:
                type = 'n1'
            else:
                type = 'n2'

            result_set = ResultSet(type, ids)
            return result_set
    def fetch_results(self, tree_node):
        results_ids = []

        if self.is_variable(tree_node.get_left_node().get_value()) and self.is_variable(tree_node.get_right_node().get_value()):
            name, var = tree_node.get_right_node().get_value().split(".")
            find = FindAllIndex(var, None, self._name_type[name], None, "id")
            results = []
            if self._name_type[name] not in self._ids_list.keys():
                for client in self._communication_service.get_client_list():
                    self.send(client.get_name(), 'IndexService', find)

                for client in self._communication_service.get_client_list():
                    source_name, source_service, res = self._queue.get()
                    results += res

                self._ids_list[self._name_type[name]] = results
            else:
                results = self._ids_list[self._name_type[name]]

            for r, id in results:
                new_node = ExpressionTreeNode(tree_node.get_value(), tree_node.get_left_node(), ExpressionTreeNode(r))
                ids = self.fetch_ids(new_node)
                for i in ids:
                    if tree_node.get_right_node().get_value().split(".")[0] == self._node_name['node2']:
                        results_ids.append((i, id))
                    else:
                        results_ids.append((id, i))
            results_ids = list(set(results_ids))
        elif self.is_variable(tree_node.get_left_node().get_value()):
            ids = self.fetch_ids(tree_node)
            for name in self._name_type.keys():
                if name != tree_node.get_left_node().get_value().split(".")[0]:
                    if self._name_type[name] not in self._ids_list.keys():
                        find = FindAllIndex('id', None, self._name_type[name], None, "id")
                        results = []
                        for client in self._communication_service.get_client_list():
                            self.send(client.get_name(), 'IndexService', find)

                        for client in self._communication_service.get_client_list():
                            source_name, source_service, res = self._queue.get()
                            results += res
                        self._ids_list[self._name_type[name]] = results
                    else:
                        results = self._ids_list[self._name_type[name]]
            for id in ids:
                for r, x in results:
                    if tree_node.get_left_node().get_value().split(".")[0] == self._node_name['node1']:
                        results_ids.append((id, r))
                    else:
                        results_ids.append((r, id))
        elif self.is_variable(tree_node.get_right_node().get_value()):
            new_node = ExpressionTreeNode(Operator.get_opposite(tree_node.get_value()), tree_node.get_right_node(), tree_node.get_left_node())
            ids = self.fetch_ids(new_node)
            for name in self._name_type.keys():
                if name != tree_node.get_left_node().get_value().split(".")[0]:
                    if self._name_type[name] not in self._ids_list.keys():
                        find = FindAllIndex('id', None, self._name_type[name], None, "id")
                        results = []
                        for client in self._communication_service.get_client_list():
                            self.send(client.get_name(), 'IndexService', find)

                        for client in self._communication_service.get_client_list():
                            source_name, source_service, res = self._queue.get()
                            results += res
                        self._ids_list[self._name_type[name]] = results
                    else:
                        results = self._ids_list[self.self._name_type[name]]
            for id in ids:
                for r, x in results:
                    if tree_node.get_right_node().get_value().split(".")[0] == self._node_name['node1']:
                        results_ids.append((id, r))
                    else:
                        results_ids.append((r, id))

        return results_ids