예제 #1
0
파일: utils.py 프로젝트: Gayout/rome
    def reload(self):

        if self.data is not None:
            return

        # CODE THIS!
        from lazy import LazyReference

        request_uuid=uuid.uuid1()

        try:
            from lib.rome.core.dataformat import get_decoder
        except:
            pass

        object_deconverter = get_decoder(request_uuid=request_uuid)

        candidates = get_models_satisfying(
            self.rel.remote_object_tablename,
            self.rel.remote_object_field,
            self.rel.local_fk_value,
            request_uuid=request_uuid
        )

        lazy_candidates = []
        for cand in candidates:
            ref = LazyReference(
                cand["nova_classname"],
                cand["id"],
                request_uuid,
                object_deconverter
            )
            lazy_candidates += [ref]
        self.data = lazy_candidates
예제 #2
0
파일: lazy.py 프로젝트: Marie-Donnie/rome
 def __getattr__(self, attr):
     if attr in self.wrapped_dict:
         value = self.wrapped_dict[attr]
         if type(value) is dict and "timezone" in value:
             if self.deconverter is None:
                 self.deconverter = get_decoder(request_uuid=self.request_uuid)
             return self.deconverter.desimplify(value)
         return value
     self.lazy_load()
     # if "_nova_classname" in self.wrapped_dict and "aggregate" in self.wrapped_dict["_nova_classname"]:
     return getattr(self.wrapped_value, attr)
예제 #3
0
파일: rows.py 프로젝트: msimonin/rome
def wrap_with_lazy_value(value, only_if_necessary=True, request_uuid=None):
    if value is None:
        return None
    if only_if_necessary and type(value).__name__ in [
            "int", "str", "float", "unicode"
    ]:
        return value
    elif type(value) is dict and "timezone" in value:
        decoder = get_decoder(request_uuid=request_uuid)
        return decoder.desimplify(value)
    else:
        return LazyValue(value, request_uuid)
예제 #4
0
파일: lazy.py 프로젝트: msimonin/rome
 def __getattr__(self, attr):
     if attr in self.wrapped_dict:
         value = self.wrapped_dict[attr]
         if type(value) is dict and "timezone" in value:
             if self.deconverter is None:
                 self.deconverter = get_decoder(
                     request_uuid=self.request_uuid)
             return self.deconverter.desimplify(value)
         return value
     self.lazy_load()
     # if "_nova_classname" in self.wrapped_dict and "aggregate" in self.wrapped_dict["_nova_classname"]:
     return getattr(self.wrapped_value, attr)
예제 #5
0
파일: expression.py 프로젝트: Gayout/rome
 def __init__(self, operator, *exps):
     def transform_exp(exp):
         if type(exp) is not BooleanExpression and self.operator != "NORMAL":
             return BooleanExpression("NORMAL", exp)
         else:
             return exp
     self.operator = operator
     self.exps = map(lambda x: transform_exp(x), exps)
     self.deconverter = get_decoder()
     self.compiled_expression = ""
     self.uuid = str(uuid.uuid1()).replace("-", "")
     # prepare the expression
     self.variable_substitution_dict = {}
     self.default_value_dict = {}
     self.prepare_expression()
예제 #6
0
파일: expression.py 프로젝트: msimonin/rome
 def __init__(self, operator, *exps):
     def transform_exp(exp):
         if type(exp) is not BooleanExpression and self.operator != "NORMAL":
             return BooleanExpression("NORMAL", exp)
         else:
             return exp
     self.operator = operator
     self.exps = map(lambda x: transform_exp(x), exps)
     self.deconverter = get_decoder()
     self.compiled_expression = ""
     self.uuid = str(uuid.uuid1()).replace("-", "")
     self.is_joining_expression = True
     self.tables_involved = []
     """ Prepare the expression. """
     self.variable_substitution_dict = {}
     self.default_value_dict = {}
     self.prepare_expression()
예제 #7
0
파일: lazy.py 프로젝트: Marie-Donnie/rome
 def __init__(self, base, id, request_uuid, deconverter):
     """Constructor"""
     from lib.rome.core.dataformat import json as json_module
     caches = json_module.CACHES
     self.base = base
     self.id = id
     self.version = -1
     self.lazy_backref_buffer = LazyBackrefBuffer()
     self.request_uuid = request_uuid if request_uuid is not None else uuid.uuid1()
     if self.request_uuid not in caches:
         caches[self.request_uuid] = {}
     self.cache = caches[self.request_uuid]
     if deconverter is None:
         from lib.rome.core.dataformat import get_decoder
         self.deconverter = get_decoder(request_uuid=request_uuid)
     else:
         self.deconverter = deconverter
     self._session = None
예제 #8
0
파일: lazy.py 프로젝트: msimonin/rome
 def __init__(self, base, id, request_uuid, deconverter):
     """Constructor"""
     from lib.rome.core.dataformat import json as json_module
     caches = json_module.CACHES
     self.base = base
     self.id = id
     self.version = -1
     self.lazy_backref_buffer = LazyBackrefBuffer()
     self.request_uuid = request_uuid if request_uuid is not None else uuid.uuid1(
     )
     if self.request_uuid not in caches:
         caches[self.request_uuid] = {}
     self.cache = caches[self.request_uuid]
     if deconverter is None:
         from lib.rome.core.dataformat import get_decoder
         self.deconverter = get_decoder(request_uuid=request_uuid)
     else:
         self.deconverter = deconverter
     self._session = None
예제 #9
0
파일: utils.py 프로젝트: Marie-Donnie/rome
def get_single_object(tablename, id, desimplify=True, request_uuid=None, skip_loading=False):
    from lib.rome.core.dataformat import get_decoder

    if isinstance(id, int):
        object_deconverter = get_decoder(request_uuid=request_uuid)
        data = database_driver.get_driver().get(tablename, id)
        if desimplify:
            try:
                model_object = object_deconverter.desimplify(data)
                if not skip_loading:
                    model_object.load(data=data)
                return model_object
            except Exception as e:
                traceback.print_exc()
                return None
        else:
            return data
    else:
        return None
예제 #10
0
def get_single_object(tablename,
                      id,
                      desimplify=True,
                      request_uuid=None,
                      skip_loading=False):
    from lib.rome.core.dataformat import get_decoder

    if isinstance(id, int):
        object_deconverter = get_decoder(request_uuid=request_uuid)
        data = database_driver.get_driver().get(tablename, id)
        if desimplify:
            try:
                model_object = object_deconverter.desimplify(data)
                if not skip_loading:
                    model_object.load(data=data)
                return model_object
            except Exception as e:
                traceback.print_exc()
                return None
        else:
            return data
    else:
        return None
예제 #11
0
파일: utils.py 프로젝트: Gayout/rome
    def reload(self):

        if self.data is not None:
            return

        # CODE THIS!
        from lazy import LazyReference

        request_uuid=uuid.uuid1()

        try:
            from lib.rome.core.dataformat import get_decoder
        except:
            pass

        object_deconverter = get_decoder(request_uuid=request_uuid)

        remote_ref = LazyReference(
            self.rel.remote_object_tablename,
            self.rel.local_fk_value,
            request_uuid,
            object_deconverter
        )
        self.data = remote_ref
예제 #12
0
파일: lazy.py 프로젝트: Marie-Donnie/rome
 def __init__(self, wrapped_date_dict, request_uuid):
     from lib.rome.core.dataformat import get_decoder
     self.deconverter = get_decoder(request_uuid=request_uuid)
     self.wrapped_date_dict = wrapped_date_dict
     self.wrapped_value = None
     self.request_uuid = request_uuid
예제 #13
0
파일: lazy.py 프로젝트: msimonin/rome
 def __init__(self, wrapped_date_dict, request_uuid):
     from lib.rome.core.dataformat import get_decoder
     self.deconverter = get_decoder(request_uuid=request_uuid)
     self.wrapped_date_dict = wrapped_date_dict
     self.wrapped_value = None
     self.request_uuid = request_uuid
예제 #14
0
파일: utils.py 프로젝트: Gayout/rome
    def update_foreign_keys(self, request_uuid=uuid.uuid1()):
        """Update foreign keys according to local fields' values."""
        # return
        from lazy import LazyReference

        if hasattr(self, "metadata"):
            metadata = self.metadata
            tablename = self.__tablename__

            if metadata and tablename in metadata.tables:
                for fk in metadata.tables[tablename].foreign_keys:
                    local_field_name = str(fk.parent).split(".")[-1]
                    remote_table_name = fk._colspec.split(".")[-2]
                    remote_field_name = fk._colspec.split(".")[-1]

                    if hasattr(self, remote_table_name):
                        pass
                    else:
                        """Remove the "s" at the end of the tablename"""
                        remote_table_name = remote_table_name[:-1]
                        pass

                    try:
                        remote_object = getattr(self, remote_table_name)
                        remote_field_value = getattr(
                            remote_object,
                            remote_field_name
                        )
                        setattr(self, local_field_name, remote_field_value)
                    except Exception as e:
                        pass
        try:
            from lib.rome.core.dataformat import get_decoder
        except:
            pass

        object_deconverter = get_decoder(request_uuid=request_uuid)
        for each in self.get_relationships():
            if each.local_fk_value is None and each.local_object_value is None:
                continue

            if not each.local_fk_value is None:
                if each.remote_object_field is "id":

                    remote_ref = LazyReference(
                        each.remote_object_tablename,
                        each.local_fk_value,
                        request_uuid,
                        object_deconverter
                    )
                    self.__dict__[each.local_object_field] = remote_ref
                    # setattr(self, each.local_object_field, remote_ref)
                else:
                    # dirty fix (grid'5000 debugging)
                    if self.__tablename__ == "services":
                        pass
                    else:
                        continue
                    candidates = get_models_satisfying(
                        each.remote_object_tablename,
                        each.remote_object_field,
                        each.local_fk_value,
                        request_uuid=request_uuid
                    )

                    lazy_candidates = []
                    for cand in candidates:
                        ref = LazyReference(
                            cand["nova_classname"],
                            cand["id"],
                            request_uuid,
                            object_deconverter
                        )
                        lazy_candidates += [ref]
                    if not each.is_list:
                        if len(lazy_candidates) is 0:
                            logging.error(("could not find an accurate candidate"
                               " for (%s, %s) in %s") % (
                                  each.remote_object_tablename,
                                  each.remote_object_field,
                                  each.local_fk_value
                              ))
                        else:
                            setattr(
                                self,
                                each.local_object_field,
                                lazy_candidates[0]
                            )
                            pass
                    else:
                        setattr(
                            self,
                            each.local_object_field,
                            lazy_candidates
                        )
                        pass
예제 #15
0
파일: rows.py 프로젝트: msimonin/rome
def construct_rows(models,
                   criterions,
                   hints,
                   session=None,
                   request_uuid=None,
                   order_by=None):
    """This function constructs the rows that corresponds to the current orm.
    :return: a list of row, according to sqlalchemy expectation
    """

    current_milli_time = lambda: int(round(time.time() * 1000))

    metadata = {}
    part1_starttime = current_milli_time()

    if request_uuid is None:
        request_uuid = uuid.uuid1()
    else:
        request_uuid = request_uuid

    labels = []
    columns = set([])
    rows = []

    model_set = extract_models(models)
    """ Get the fields of the join result """
    for selectable in model_set:
        labels += [find_table_name(selectable._model)]
        if selectable._attributes == "*":
            try:
                selected_attributes = selectable._model._sa_class_manager
            except:
                traceback.print_exc()
                selected_attributes = selectable._model.class_._sa_class_manager
                pass
        else:
            selected_attributes = [selectable._attributes]

        for field in selected_attributes:
            attribute = None
            if has_attribute(models, "class_"):
                attribute = selectable._model.class_._sa_class_manager[
                    field].__str__()
            elif has_attribute(models, "_sa_class_manager"):
                attribute = selectable._model._sa_class_manager[field].__str__(
                )
            if attribute is not None:
                columns.add(attribute)
    part2_starttime = current_milli_time()
    """ Loading objects (from database) """
    list_results = []
    for selectable in model_set:
        tablename = find_table_name(selectable._model)
        authorized_secondary_indexes = get_attribute(selectable._model,
                                                     "_secondary_indexes", [])
        selected_hints = filter(
            lambda x: x.table_name == tablename and
            (x.attribute == "id" or x.attribute in authorized_secondary_indexes
             ), hints)
        reduced_hints = map(lambda x: (x.attribute, x.value), selected_hints)
        objects = get_objects(tablename,
                              request_uuid=request_uuid,
                              skip_loading=False,
                              hints=reduced_hints)
        list_results += [objects]
    part3_starttime = current_milli_time()
    """ Building tuples """
    building_tuples = join_building_tuples
    tuples = building_tuples(list_results,
                             labels,
                             criterions,
                             hints,
                             metadata=metadata,
                             order_by=order_by)
    part4_starttime = current_milli_time()
    """ Filtering tuples (cartesian product) """
    for product in tuples:
        if len(product) > 0:
            row = KeyedTuple(product, labels=labels)
            rows += [extract_sub_row(row, model_set, labels)]
    part5_starttime = current_milli_time()
    deconverter = get_decoder(request_uuid=request_uuid)
    """ Reordering tuples (+ selecting attributes) """
    final_rows = []
    showable_selection = [
        x for x in models if (not x.is_hidden) or x._is_function
    ]
    part6_starttime = current_milli_time()
    """ Selecting attributes """
    if any_selectable_is_function(models):
        final_row = []
        for selection in showable_selection:
            if selection._is_function:
                value = selection._function._function(rows)
                final_row += [value]
            else:
                final_row += [None]
        final_row = map(lambda x: deconverter.desimplify(x), final_row)
        return [final_row]
    else:
        for row in rows:
            final_row = []
            for selection in showable_selection:
                if selection._is_function:
                    value = selection._function._function(rows)
                    final_row += [value]
                else:
                    current_table_name = find_table_name(selection._model)
                    key = current_table_name
                    if not is_novabase(row) and has_attribute(row, key):
                        value = get_attribute(row, key)
                    else:
                        value = row
                    if value is not None:
                        if selection._attributes != "*":
                            final_row += [
                                get_attribute(value, selection._attributes)
                            ]
                        else:
                            final_row += [value]
            final_row = map(
                lambda x: wrap_with_lazy_value(x, request_uuid=request_uuid),
                final_row)
            if len(showable_selection) == 1:
                final_rows += final_row
            else:
                final_rows += [final_row]
    part7_starttime = current_milli_time()

    query_information = """{"building_query": %s, "loading_objects": %s, "building_tuples": %s, "filtering_tuples": %s, "reordering_columns": %s, "selecting_attributes": %s, "description": "%s", "timestamp": %i}""" % (
        part2_starttime - part1_starttime, part3_starttime - part2_starttime,
        part4_starttime - part3_starttime, part5_starttime - part4_starttime,
        part6_starttime - part5_starttime, part7_starttime - part6_starttime,
        metadata["sql"] if "sql" in metadata else
        """{\\"models\\": \\"%s\\", \\"criterions\\": \\"%s\\"}""" %
        (models, criterions), current_milli_time())

    logging.info(query_information)
    if file_logger_enabled:
        file_logger.info(query_information)

    return final_rows
예제 #16
0
파일: rows.py 프로젝트: Gayout/rome
def construct_rows(models, criterions, hints, session=None):

    """This function constructs the rows that corresponds to the current orm.
    :return: a list of row, according to sqlalchemy expectation
    """

    current_milli_time = lambda: int(round(time.time() * 1000))

    part1_starttime = current_milli_time()

    request_uuid = uuid.uuid1()

    labels = []
    columns = set([])
    rows = []

    model_set = extract_models(models)

    # get the fields of the join result
    for selectable in model_set:
        labels += [find_table_name(selectable._model)]
        if selectable._attributes == "*":
            try:
                selected_attributes = selectable._model._sa_class_manager
            except:
                selected_attributes = selectable._model.class_._sa_class_manager
                pass
        else:
            selected_attributes = [selectable._attributes]

        for field in selected_attributes:
            attribute = None
            if has_attribute(models, "class_"):
                attribute = selectable._model.class_._sa_class_manager[field].__str__()
            elif has_attribute(models, "_sa_class_manager"):
                attribute = selectable._model._sa_class_manager[field].__str__()
            if attribute is not None:
                columns.add(attribute)
    part2_starttime = current_milli_time()

    # loading objects (from database)
    list_results = []
    for selectable in model_set:
        tablename = find_table_name(selectable._model)
        authorized_secondary_indexes = get_attribute(selectable._model, "_secondary_indexes", [])
        selected_hints = filter(lambda x: x.table_name == tablename and (x.attribute == "id" or x.attribute in authorized_secondary_indexes), hints)
        reduced_hints = map(lambda x:(x.attribute, x.value), selected_hints)
        objects = get_objects(tablename, request_uuid=request_uuid, skip_loading=False, hints=reduced_hints)
        list_results += [objects]
    part3_starttime = current_milli_time()

    # construct the cartesian product
    # tuples = building_tuples(list_results, labels, criterions)
    tuples = building_tuples_experimental(list_results, labels, criterions, hints)
    part4_starttime = current_milli_time()

    # # filtering tuples (cartesian product)
    #
    # # aggregated_filters = {}
    # # for criterion in criterions:
    # #     for each in
    # #     criterion
    # #     pass
    #
    indexed_rows = {}
    for product in tuples:
        if len(product) > 0:
            row = KeyedTuple(product, labels=labels)
            row_index_key = "%s" % (str(row))

            if row_index_key in indexed_rows:
                continue

            all_criterions_satisfied = True

            for criterion in criterions:
                if not criterion.evaluate(row):
                    all_criterions_satisfied = False
            if all_criterions_satisfied:
                indexed_rows[row_index_key] = True
                rows += [extract_sub_row(row, model_set)]
    part5_starttime = current_milli_time()
    deconverter = get_decoder(request_uuid=request_uuid)
    # reordering tuples (+ selecting attributes)
    final_rows = []
    showable_selection = [x for x in models if (not x.is_hidden) or x._is_function]
    part6_starttime = current_milli_time()
    # selecting attributes
    if all_selectable_are_functions(models):
        final_row = []
        for selection in showable_selection:
            value = selection._function._function(rows)
            final_row += [value]
        final_row = map(lambda x: deconverter.desimplify(x), final_row)
        return [final_row]
    else:
        for row in rows:
            final_row = []
            for selection in showable_selection:
                if selection._is_function:
                    value = selection._function._function(rows)
                    final_row += [value]
                else:
                    current_table_name = find_table_name(selection._model)
                    key = current_table_name
                    if not is_novabase(row) and has_attribute(row, key):
                        value = get_attribute(row, key)
                    else:
                        value = row
                    if value is not None:
                        if selection._attributes != "*":
                            final_row += [get_attribute(value, selection._attributes)]
                        else:
                            final_row += [value]

            # final_row = map(lambda x: deconverter.desimplify(x), final_row)
            final_row = map(lambda x: LazyValue(x, request_uuid), final_row)

            if len(showable_selection) == 1:
                final_rows += final_row
            else:
                final_rows += [final_row]
    part7_starttime = current_milli_time()

    query_information = """{"building_query": %s, "loading_objects": %s, "building_tuples": %s, "filtering_tuples": %s, "reordering_columns": %s, "selecting_attributes": %s, "description": "%s", "timestamp": %i}""" % (
        part2_starttime - part1_starttime,
        part3_starttime - part2_starttime,
        part4_starttime - part3_starttime,
        part5_starttime - part4_starttime,
        part6_starttime - part5_starttime,
        part7_starttime - part6_starttime,
        """{\\"models\\": \\"%s\\", \\"criterions\\": \\"%s\\"}""" % (models, criterions),
        current_milli_time()
    )

    logging.info(query_information)
    if file_logger_enabled:
        file_logger.info(query_information)

    return final_rows
예제 #17
0
파일: lazy.py 프로젝트: Marie-Donnie/rome
 def transform(self, x):
     if self.deconverter is None:
         self.deconverter = get_decoder(request_uuid=self.request_uuid)
     return self.deconverter.desimplify(x)
예제 #18
0
파일: lazy.py 프로젝트: msimonin/rome
 def lazy_load(self):
     if self.wrapped_value is None:
         if self.deconverter is None:
             self.deconverter = get_decoder(request_uuid=self.request_uuid)
         self.wrapped_value = self.deconverter.desimplify(self.wrapped_dict)
         self.load_relationships()
예제 #19
0
 def __init__(self, **entries):
     self.entries = entries
     self.deconverter = get_decoder()
예제 #20
0
파일: lazy.py 프로젝트: Marie-Donnie/rome
 def lazy_load(self):
     if self.wrapped_value is None:
         if self.deconverter is None:
             self.deconverter = get_decoder(request_uuid=self.request_uuid)
         self.wrapped_value = self.deconverter.desimplify(self.wrapped_dict)
         self.load_relationships()
예제 #21
0
파일: expression.py 프로젝트: msimonin/rome
 def __init__(self, **entries):
     self.entries = entries
     self._cache = {}
     self.deconverter = get_decoder()
예제 #22
0
파일: lazy.py 프로젝트: msimonin/rome
 def transform(self, x):
     if self.deconverter is None:
         self.deconverter = get_decoder(request_uuid=self.request_uuid)
     return self.deconverter.desimplify(x)