示例#1
0
  def _compute_ratios(stats_clause):
    tc_session.expunge_all()
    avg_from_rate = select([alias(
        select([func.avg(RouterStats.circ_from_rate)],
                           stats_clause)
        )]).as_scalar()
    avg_to_rate = select([alias(
        select([func.avg(RouterStats.circ_to_rate)],
                           stats_clause)
        )]).as_scalar()
    avg_bi_rate = select([alias(
        select([func.avg(RouterStats.circ_bi_rate)],
                           stats_clause)
        )]).as_scalar()
    avg_ext = select([alias(
        select([func.avg(RouterStats.avg_first_ext)],
                           stats_clause)
        )]).as_scalar()
    avg_sbw = select([alias(
        select([func.avg(RouterStats.sbw)],
                           stats_clause)
        )]).as_scalar()

    RouterStats.table.update(stats_clause, values=
       {RouterStats.table.c.circ_from_ratio:
         (1-RouterStats.table.c.circ_from_rate)/(1-avg_from_rate),
        RouterStats.table.c.circ_to_ratio:
         (1-RouterStats.table.c.circ_to_rate)/(1-avg_to_rate),
        RouterStats.table.c.circ_bi_ratio:
         (1-RouterStats.table.c.circ_bi_rate)/(1-avg_bi_rate),
        RouterStats.table.c.ext_ratio:
         avg_ext/RouterStats.table.c.avg_first_ext,
        RouterStats.table.c.sbw_ratio:
         RouterStats.table.c.sbw/avg_sbw}).execute()
    tc_session.commit()
示例#2
0
文件: party.py 项目: Governa/Camelot
    def full_name( self ):

        aliased_organisation = sql.alias( Organization.table )
        aliased_person = sql.alias( Person.table )
        
        return sql.functions.coalesce( sql.select( [sql.functions.coalesce(aliased_person.c.first_name,'') + ' ' + sql.functions.coalesce(aliased_person.c.last_name, '')],
                                                   whereclause = and_( aliased_person.c.party_id == self.id ),
                                                   ).limit( 1 ).as_scalar(),
                                       sql.select( [aliased_organisation.c.name],
                                                   whereclause = and_( aliased_organisation.c.party_id == self.id ), 
                                                   ).limit( 1 ).as_scalar() )
示例#3
0
 def query(self):
     pq = qualstat_getstatdata(column("eval_type") == "f")
     base = alias(pq)
     query = (select([
         func.array_agg(column("queryid")).label("queryids"),
         "qualid",
         cast(column("quals"), JSONB).label('quals'),
         "occurences",
         "execution_count",
         func.array_agg(column("query")).label("queries"),
         "avg_filter",
         "filter_ratio"
     ]).select_from(
         join(base, powa_databases,
              onclause=(
                  powa_databases.c.oid == literal_column("dbid"))))
         .where(powa_databases.c.datname == bindparam("database"))
         .where(column("avg_filter") > 1000)
         .where(column("filter_ratio") > 0.3)
         .group_by(column("qualid"), column("execution_count"),
                   column("occurences"),
                   cast(column("quals"), JSONB),
                  column("avg_filter"), column("filter_ratio"))
         .order_by(column("occurences").desc())
         .limit(200))
     return query
示例#4
0
    def full_name(self):

        aliased_organisation = sql.alias(Organization.table)
        aliased_person = sql.alias(Person.table)

        return sql.functions.coalesce(
            sql.select(
                [
                    sql.functions.coalesce(aliased_person.c.first_name, '') +
                    ' ' +
                    sql.functions.coalesce(aliased_person.c.last_name, '')
                ],
                whereclause=and_(aliased_person.c.party_id == self.id),
            ).limit(1).as_scalar(),
            sql.select(
                [aliased_organisation.c.name],
                whereclause=and_(aliased_organisation.c.party_id == self.id),
            ).limit(1).as_scalar())
示例#5
0
文件: sql_util.py 项目: calston/tums
 def __init__(self, *tables, **kwargs):
     self.tables = {}
     self.aliases = kwargs.get('aliases', {})
     for t in tables:
         self.tables[t] = t
         if not self.aliases.has_key(t):
             self.aliases[t] = sql.alias(t)
         if isinstance(t, sql.Join):
             for t2 in t.columns:
                 self.tables[t2.table] = t2
                 self.aliases[t2.table] = self.aliases[t]
     self.binary = None
示例#6
0
        def get_range_data(offset_, size_):
            tbl_main = alias(tbl_def, 't')
            join_condition = []

            pk_names_desc = [name+" DESC" for name in pk_names]
            sub_q = select(pk_cols).order_by(", ".join(pk_names_desc)).offset(offset_).limit(1).alias()

            for pk_name in pk_names:
                item = (tbl_main.c[pk_name] <= sub_q.c[pk_name])
                join_condition.append(item)

            if len(join_condition) > 1:
                j = join(tbl_main, sub_q, and_(*join_condition))
            else:
                j = join(tbl_main, sub_q, join_condition[0])

            return select([tbl_main]).select_from(j).order_by(", ".join(pk_names_desc)).limit(size_)
示例#7
0
        def get_range_data(offset_, size_):
            tbl_main = alias(tbl_def, 't')
            join_condition = []

            pk_names_desc = [name + " DESC" for name in pk_names]
            sub_q = select(pk_cols).order_by(
                ", ".join(pk_names_desc)).offset(offset_).limit(1).alias()

            for pk_name in pk_names:
                item = (tbl_main.c[pk_name] <= sub_q.c[pk_name])
                join_condition.append(item)

            if len(join_condition) > 1:
                j = join(tbl_main, sub_q, and_(*join_condition))
            else:
                j = join(tbl_main, sub_q, join_condition[0])

            return select([tbl_main]).select_from(j).order_by(
                ", ".join(pk_names_desc)).limit(size_)
示例#8
0
  def _compute_ranks():
    tc_session.expunge_all()
    l_session = tc_session()
    min_r = select([func.min(BwHistory.rank)],
        BwHistory.table.c.router_idhex
            == RouterStats.table.c.router_idhex).as_scalar()
    avg_r = select([func.avg(BwHistory.rank)],
        BwHistory.table.c.router_idhex
            == RouterStats.table.c.router_idhex).as_scalar()
    max_r = select([func.max(BwHistory.rank)],
        BwHistory.table.c.router_idhex
            == RouterStats.table.c.router_idhex).as_scalar()
    avg_bw = select([func.avg(BwHistory.bw)],
        BwHistory.table.c.router_idhex
            == RouterStats.table.c.router_idhex).as_scalar()
    avg_desc_bw = select([func.avg(BwHistory.desc_bw)],
        BwHistory.table.c.router_idhex
            == RouterStats.table.c.router_idhex).as_scalar()

    RouterStats.table.update(values=
       {RouterStats.table.c.min_rank:min_r,
        RouterStats.table.c.avg_rank:avg_r,
        RouterStats.table.c.max_rank:max_r,
        RouterStats.table.c.avg_bw:avg_bw,
        RouterStats.table.c.avg_desc_bw:avg_desc_bw}).execute()

    #min_avg_rank = select([func.min(RouterStats.avg_rank)]).as_scalar()

    # the commented query breaks mysql because UPDATE cannot reference
    # target table in the FROM clause. So we throw in an anonymous alias and wrap
    # another select around it in order to get the nested SELECT stored into a 
    # temporary table.
    # FIXME: performance? no idea 
    #max_avg_rank = select([func.max(RouterStats.avg_rank)]).as_scalar()
    max_avg_rank = select([alias(select([func.max(RouterStats.avg_rank)]))]).as_scalar()

    RouterStats.table.update(values=
       {RouterStats.table.c.percentile:
            (100.0*RouterStats.table.c.avg_rank)/max_avg_rank}).execute()

    l_session.commit()
    tc_session.remove()
示例#9
0
def get_ticcl_variants(session, wordform, lexicon_id, corpus_id):
    wf_to = alias(Wordform)
    q = select([Wordform.wordform.label('wordform_from'),
                WordformLinkSource.wordform_from_correct,
                wf_to.c.wordform.label('wordform_to'),
                WordformLinkSource.wordform_to_correct,
                WordformLinkSource.ld,
                func.sum(TextAttestation.frequency).label('freq_in_corpus')]) \
        .select_from(WordformLink.__table__
                     .join(WordformLinkSource)
                     .join(Wordform,
                           onclause=WordformLink.wordform_from == Wordform.wordform_id)
                     .join(wf_to, onclause=WordformLink.wordform_to == wf_to.c.wordform_id)
                     .join(TextAttestation,
                           onclause=wf_to.c.wordform_id == TextAttestation.wordform_id)
                     .join(Document).join(corpusId_x_documentId).join(Corpus)) \
        .where(and_(Wordform.wordform == wordform,
                    WordformLinkSource.lexicon_id == lexicon_id,
                    Corpus.corpus_id == corpus_id)) \
        .group_by('wordform_to',
                  WordformLinkSource.wordform_from_correct,
                  WordformLinkSource.wordform_to_correct,
                  WordformLinkSource.ld) \
        .order_by(desc('freq_in_corpus'), WordformLinkSource.ld, 'wordform_to')
    df = pd.read_sql(q, session.get_bind())

    correct = None
    if df.shape[0] > 0:
        correct = df.loc[0, 'wordform_from_correct']

    df = df[['wordform_to', 'wordform_to_correct', 'ld', 'freq_in_corpus']]
    df.columns = ['wordform', 'correct', 'ld', 'freq_in_corpus']

    return {
        'wordform': wordform,
        'correct': bool(correct),
        'links': df.to_dict(orient='record')
    }
示例#10
0
 def query(self):
     pq = qualstat_getstatdata(bindparam("server"),
                               column("eval_type") == "f")
     base = alias(pq)
     query = (
         select([
             # queryid in pg11+ is int64, so the value can exceed javascript's
             # Number.MAX_SAFE_INTEGER, which mean that the value can get
             # truncated by the browser, leading to looking for unexisting
             # queryid when processing this data.  To avoid that, simply cast
             # the value to text.
             func.array_agg(cast(column("queryid"),
                                 TEXT)).label("queryids"),
             column("qualid"),
             cast(column("quals"), JSONB).label('quals'),
             column("occurences"),
             column("execution_count"),
             func.array_agg(column("query")).label("queries"),
             column("avg_filter"),
             column("filter_ratio")
         ]).select_from(
             join(base,
                  powa_databases,
                  onclause=(powa_databases.c.oid == literal_column("dbid")
                            and powa_databases.c.srvid
                            == literal_column("srvid")))).
         where(powa_databases.c.datname == bindparam("database")).where(
             powa_databases.c.srvid == bindparam("server")).where(
                 column("avg_filter") > 1000).where(
                     column("filter_ratio") > 0.3).group_by(
                         column("qualid"), column("execution_count"),
                         column("occurences"), cast(column("quals"), JSONB),
                         column("avg_filter"),
                         column("filter_ratio")).order_by(
                             column("occurences").desc()).limit(200))
     return query
示例#11
0
    def read(self,
             df_name=None,
             query=None,
             where=None,
             group_by=None,
             order_by=None,
             limit=None,
             offset=None,
             disable_count_total=False,
             **kwargs):
        """Read data from SQL.

        Args:
            df_name (str): Dataframe name to read
            query (str SQL query or SQLAlchemy Selectable): query to select items
            where (str): query string for filtering items
            group_by (str): column name to group
            order_by (srt): column name to sort by
            limit (int): number of items to return per a page
            offset (int): offset of cursor
            disable_count_total (bool): if True, `self.count_total` will not be calculated
            **kwargs: kwargs for function `pandas.read_sql_query`
                      or `influxdb.DataFrameClient.query`

        """
        if df_name is not None:
            self.df_name = df_name

        # Create a query
        q = query
        q_count = 'select count(*) from ({}) as sub'.format(q) if q is not None else None
        if q is None:
            # Check if the table exits on DB
            if not inspect(self._engine).has_table(self.df_name):
                self.df = self._initialize_df()
                return

            # Create a query
            if self._config.current_db['engine'] in ['postgresql', 'timescaledb']:
                q = sql.select('*', from_obj=sql.table(self.df_name))
                if group_by is not None:
                    q = sql.select(
                        [sql.text(self._distinct(c))
                         for c in self._get_column_names_from_db()],
                        from_obj=sql.table(self.df_name))
                    q = q.group_by(sql.text(group_by))
                if where is not None:
                    q = q.where(sql.text(where))
                q_count = sql.select([sql.text('count(*)')], from_obj=sql.alias(q, 'sub'))
            else:
                q = sql.select('*', from_obj=sql.table(self.df_name))
                q_count = sql.select([sql.text('count(*)')], from_obj=sql.table(self.df_name))
                if group_by is not None:
                    q = sql.select(
                        [sql.text(self._distinct(c))
                         for c in self._get_column_names_from_db()],
                        from_obj=sql.table(self.df_name))
                    q = q.group_by(sql.text(group_by))
                    q_count = sql.select([sql.text('count(distinct {})'.format(group_by))],
                                         from_obj=sql.table(self.df_name))
                if where is not None:
                    q = q.where(sql.text(where))
                    q_count = q_count.where(sql.text(where))

            # Add common options
            if order_by is not None:
                q = q.order_by(sql.text(order_by))
            if limit is not None:
                q = q.limit(limit)
            if offset is not None:
                q = q.offset(offset)

        # Read table from DB
        try:
            # Calculate total number of rows
            if not disable_count_total:
                count = self._engine.execute(q_count).scalar()
            else:
                count = 0

            # Fetch data
            if 'index_col' not in kwargs.keys():
                kwargs.update({'index_col': 'uuid_in_df'})
            df = pd.read_sql_query(q, self._engine, **kwargs)
            df = df[~df.index.duplicated(keep='last')]
        except Exception as e:
            self.logger.warning('Could not execute SQL statement: "{0}" (reason: {1})'.
                                format(str(q), str(e)))
            count = 0
            df = self._initialize_df()

        self._count_total = count
        self.df = df
示例#12
0
    def _load_tree_rows(self, conn, where, order_by, parent_id):
        """Load rows as a tree."""
        if where is not None:
            # FIXME: If we have a where clause, we cant load the results lazily
            # because, we don't know if a row's children/grandchildren/etc will
            # match.  If this optimization (loading the leafs and the necessary
            # parents until the root) good enough?
            children = {}
            node_mapper = {}

            def load_rows(where_):
                query = self.select(conn,
                                    self.table,
                                    columns=self.table.columns,
                                    where=where_,
                                    order_by=order_by)
                for row in query:
                    row_id = row[self.id_column_idx]
                    if row_id in node_mapper:
                        continue

                    c_list = children.setdefault(row[self.parent_column_idx],
                                                 [])
                    node = Node(data=row)
                    c_list.append(node)
                    node_mapper[row_id] = node

            load_rows(where)
            if not children:
                return

            # Load parents incrementally until we are left with the root
            while children.keys() != [None]:
                parents_to_load = []
                for parent, c_list in children.items():
                    if parent is None:
                        continue

                    node = node_mapper.get(parent, None)
                    if node is None:
                        parents_to_load.append(parent)
                        continue

                    node.extend(c_list)
                    node.children_len = len(node)
                    del children[parent]

                if parents_to_load:
                    where = self.table.columns[self.ID_COLUMN].in_(
                        parents_to_load)
                    load_rows(where)

            for node in children[None]:
                yield node
        else:
            # If there's no where clause, we can load the results lazily
            where = self.table.columns[self.PARENT_ID_COLUMN] == parent_id

            if self.CHILDREN_LEN_COLUMN is None:
                count_table = alias(self.table, '__count')
                # We could use the comparison between the columns, but that would
                # make sqlalchemy add self.table in the FROM clause, which
                # would produce wrong results.
                count_where = '%s.%s = %s.%s' % (
                    count_table.name, self.PARENT_ID_COLUMN, self.table.name,
                    self.ID_COLUMN)
                count_select = select([func.count(1)],
                                      whereclause=count_where,
                                      from_obj=[count_table])

                columns = self.table.columns.values()
                # We have to compile this here or else sqlalchemy would put
                # this inside the FROM part.
                columns.append('(%s)' % (_compile(count_select), ))
                extra_count_col = True
            else:
                columns = self.table.columns
                extra_count_col = False

            query = self.select(conn,
                                self.table,
                                columns=columns,
                                where=where,
                                order_by=order_by)

            for row in query:
                if extra_count_col:
                    children_len = row.pop(-1)
                else:
                    children_len = row[self.children_len_column_idx]

                yield Node(data=row, children_len=children_len)
示例#13
0
def get_old_messages_backend(request, user_profile,
                             anchor = REQ(converter=int),
                             num_before = REQ(converter=to_non_negative_int),
                             num_after = REQ(converter=to_non_negative_int),
                             narrow = REQ('narrow', converter=narrow_parameter, default=None),
                             use_first_unread_anchor = REQ(default=False, converter=ujson.loads),
                             apply_markdown=REQ(default=True,
                                                converter=ujson.loads)):
    # type: (HttpRequest, UserProfile, int, int, int, Optional[List[Dict[str, Any]]], bool, bool) -> HttpResponse
    include_history = ok_to_include_history(narrow, user_profile.realm)

    if include_history and not use_first_unread_anchor:
        query = select([column("id").label("message_id")], None, table("zerver_message"))
        inner_msg_id_col = literal_column("zerver_message.id")
    elif narrow is None:
        query = select([column("message_id"), column("flags")],
                       column("user_profile_id") == literal(user_profile.id),
                       table("zerver_usermessage"))
        inner_msg_id_col = column("message_id")
    else:
        # TODO: Don't do this join if we're not doing a search
        query = select([column("message_id"), column("flags")],
                       column("user_profile_id") == literal(user_profile.id),
                       join(table("zerver_usermessage"), table("zerver_message"),
                            literal_column("zerver_usermessage.message_id") ==
                            literal_column("zerver_message.id")))
        inner_msg_id_col = column("message_id")

    num_extra_messages = 1
    is_search = False

    if narrow is not None:
        # Add some metadata to our logging data for narrows
        verbose_operators = []
        for term in narrow:
            if term['operator'] == "is":
                verbose_operators.append("is:" + term['operand'])
            else:
                verbose_operators.append(term['operator'])
        request._log_data['extra'] = "[%s]" % (",".join(verbose_operators),)

        # Build the query for the narrow
        num_extra_messages = 0
        builder = NarrowBuilder(user_profile, inner_msg_id_col)
        search_term = None # type: Optional[Dict[str, Any]]
        for term in narrow:
            if term['operator'] == 'search':
                if not is_search:
                    search_term = term
                    query = query.column(column("subject")).column(column("rendered_content"))
                    is_search = True
                else:
                    # Join the search operators if there are multiple of them
                    search_term['operand'] += ' ' + term['operand']
            else:
                query = builder.add_term(query, term)
        if is_search:
            query = builder.add_term(query, search_term)

    # We add 1 to the number of messages requested if no narrow was
    # specified to ensure that the resulting list always contains the
    # anchor message.  If a narrow was specified, the anchor message
    # might not match the narrow anyway.
    if num_after != 0:
        num_after += num_extra_messages
    else:
        num_before += num_extra_messages

    sa_conn = get_sqlalchemy_connection()
    if use_first_unread_anchor:
        condition = column("flags").op("&")(UserMessage.flags.read.mask) == 0

        # We exclude messages on muted topics when finding the first unread
        # message in this narrow
        muting_conditions = exclude_muting_conditions(user_profile, narrow)
        if muting_conditions:
            condition = and_(condition, *muting_conditions)

        first_unread_query = query.where(condition)
        first_unread_query = first_unread_query.order_by(inner_msg_id_col.asc()).limit(1)
        first_unread_result = list(sa_conn.execute(first_unread_query).fetchall())
        if len(first_unread_result) > 0:
            anchor = first_unread_result[0][0]
        else:
            anchor = LARGER_THAN_MAX_MESSAGE_ID

    before_query = None
    after_query = None
    if num_before != 0:
        before_anchor = anchor
        if num_after != 0:
            # Don't include the anchor in both the before query and the after query
            before_anchor = anchor - 1
        before_query = query.where(inner_msg_id_col <= before_anchor) \
                            .order_by(inner_msg_id_col.desc()).limit(num_before)
    if num_after != 0:
        after_query = query.where(inner_msg_id_col >= anchor) \
                           .order_by(inner_msg_id_col.asc()).limit(num_after)

    if anchor == LARGER_THAN_MAX_MESSAGE_ID:
        # There's no need for an after_query if we're targeting just the target message.
        after_query = None

    if before_query is not None:
        if after_query is not None:
            query = union_all(before_query.self_group(), after_query.self_group())
        else:
            query = before_query
    elif after_query is not None:
        query = after_query
    else:
        # This can happen when a narrow is specified.
        query = query.where(inner_msg_id_col == anchor)

    main_query = alias(query)
    query = select(main_query.c, None, main_query).order_by(column("message_id").asc())
    # This is a hack to tag the query we use for testing
    query = query.prefix_with("/* get_old_messages */")
    query_result = list(sa_conn.execute(query).fetchall())

    # The following is a little messy, but ensures that the code paths
    # are similar regardless of the value of include_history.  The
    # 'user_messages' dictionary maps each message to the user's
    # UserMessage object for that message, which we will attach to the
    # rendered message dict before returning it.  We attempt to
    # bulk-fetch rendered message dicts from remote cache using the
    # 'messages' list.
    search_fields = dict() # type: Dict[int, Dict[str, Text]]
    message_ids = [] # type: List[int]
    user_message_flags = {} # type: Dict[int, List[str]]
    if include_history:
        message_ids = [row[0] for row in query_result]

        # TODO: This could be done with an outer join instead of two queries
        user_message_flags = dict((user_message.message_id, user_message.flags_list()) for user_message in
                                  UserMessage.objects.filter(user_profile=user_profile,
                                                             message__id__in=message_ids))
        for row in query_result:
            message_id = row[0]
            if user_message_flags.get(message_id) is None:
                user_message_flags[message_id] = ["read", "historical"]
            if is_search:
                (_, subject, rendered_content, content_matches, subject_matches) = row
                search_fields[message_id] = get_search_fields(rendered_content, subject,
                                                              content_matches, subject_matches)
    else:
        for row in query_result:
            message_id = row[0]
            flags = row[1]
            user_message_flags[message_id] = parse_usermessage_flags(flags)

            message_ids.append(message_id)

            if is_search:
                (_, _, subject, rendered_content, content_matches, subject_matches) = row
                search_fields[message_id] = get_search_fields(rendered_content, subject,
                                                              content_matches, subject_matches)

    cache_transformer = lambda row: MessageDict.build_dict_from_raw_db_row(row, apply_markdown)
    id_fetcher = lambda row: row['id']

    message_dicts = generic_bulk_cached_fetch(lambda message_id: to_dict_cache_key_id(message_id, apply_markdown),
                                              Message.get_raw_db_rows,
                                              message_ids,
                                              id_fetcher=id_fetcher,
                                              cache_transformer=cache_transformer,
                                              extractor=extract_message_dict,
                                              setter=stringify_message_dict)

    message_list = []
    for message_id in message_ids:
        msg_dict = message_dicts[message_id]
        msg_dict.update({"flags": user_message_flags[message_id]})
        msg_dict.update(search_fields.get(message_id, {}))
        message_list.append(msg_dict)

    statsd.incr('loaded_old_messages', len(message_list))
    ret = {'messages': message_list,
           "result": "success",
           "msg": ""}
    return json_success(ret)
示例#14
0
    def store_packages(self, **kwargs):

        pkg_data = kwargs.get("pkg_data")
        rpms = {}

        files = 0

        log.info("Storing packages...")

        # Remove any existing records
        fdl = alias(RpmFileDetailLink)
        rd = alias(RpmDetail)

        delete_fdl = delete(fdl).where(
            exists(
                select(
                    [1]).where(rd.c.system_id == self.system.system_id).where(
                        rd.c.rpm_detail_id == fdl.c.rpm_detail_id)))

        log.info(
            f"Pruned {State.get_db_session().execute(delete_fdl).rowcount} links."
        )

        system_rpm_detail = State.get_db_session().query(RpmDetail).filter(
            RpmDetail.system == self.system)

        system_rpm_detail.delete()
        log.info("Pruned existing RpmDetail records.")

        system_rpm_info = State.get_db_session().query(RpmInfo).filter(
            RpmInfo.system == self.system)
        system_rpm_info.delete()
        log.info("Pruned existing RpmInfo records.")

        State.get_db_session().flush()
        State.get_db_session().commit()

        fieldnames = (
            'package_name',
            'version',
            'release',
            'architecture',
            'installation_tid',
            'installation_date',
            'file_name',
            'file_size',
            'digest',
            'file_class',
            'flag',
            'source_rpm',
            'rpm_name',
        )

        objects = []
        for row in self._convert_results(file_iter=pkg_data,
                                         fieldnames=fieldnames):

            file = {
                key: value if value != '(none)' else None
                for key, value in row.items()
            }

            rpm_key = '+'.join([
                file['package_name'] or 'none',
                file['version'] or 'none',
                file['architecture'] or 'none',
            ])

            rpm = rpms.get(rpm_key, None)

            if not rpm:

                try:
                    installation_tid = int(file['installation_tid']
                                           or ''.strip())
                except ValueError:
                    installation_tid = None

                try:
                    installation_date = parser.parse(file['installation_date'])
                except ValueError:
                    installation_date = None

                rpm = RpmInfo(
                    name=file['package_name'],
                    version=file['version'],
                    release=file['release'],
                    filename=file['rpm_name'],
                    architecture=file['architecture'],
                    installation_tid=installation_tid,
                    installation_date=installation_date,
                    system_id=self.system.system_id,
                )

                State.get_db_session().add(rpm)
                State.get_db_session().flush()

                rpms[rpm_key] = rpm

            try:
                file_size = int(file['file_size'] or ''.strip())
            except ValueError:
                file_size = None

            objects.append({
                "rpm_info_id": rpm.rpm_info_id,
                "file_location": file['file_name'],
                "file_size": file_size,
                "digest": file['digest'] or None,
                "file_info": file['file_class'],
                "file_flag": file['flag'],
                "system_id": self.system.system_id,
                "file_changed": None,
            })

            files += 1

            if files % 50000 == 0:
                log.info(f"{files}")
                State.get_db_session().bulk_insert_mappings(RpmDetail, objects)
                State.get_db_session().flush()
                objects.clear()

        if objects:
            State.get_db_session().bulk_insert_mappings(RpmDetail, objects)

        objects.clear()
        State.get_db_session().flush()
        State.get_db_session().commit()

        log.info('..done')
示例#15
0
    def store_files(self, **kwargs):
        file_iter = kwargs.get("file_iter")

        files = 0

        log.info("Storing files...")

        # Remove any existing records
        fdl = alias(RpmFileDetailLink)
        fd = alias(FileDetail)

        delete_fdl = delete(fdl).where(
            exists(
                select(
                    [1]).where(fd.c.system_id == self.system.system_id).where(
                        fd.c.file_detail_id == fdl.c.file_detail_id)))

        log.info(
            f"Pruned {State.get_db_session().execute(delete_fdl).rowcount} links."
        )

        # delete FileStorage links
        FileDifference(system=self.system).clear_system_file_storage()

        system_files = State.get_db_session().query(FileDetail).filter(
            FileDetail.system == self.system)

        system_files.delete()

        log.info("Pruned existing FileDetails.")

        State.get_db_session().flush()
        State.get_db_session().commit()

        objects = []

        for file_dict in self._convert_results(file_iter=file_iter):
            src = FileOrigin.UnknownSource
            file_path = file_dict.get("path", "")

            if (file_path.startswith("/dev/") or file_path.startswith("/tmp/")
                    or file_path.startswith("/proc/")
                    or (file_path.startswith("/var/log/")
                        and file_path.endswith(".log"))):
                src = FileOrigin.EphemeralContent

            file_rec = {
                "system_id": self.system.system_id,
                "file_location": file_path or None,
                "file_type": file_dict['type'],
                "owner_uid": file_dict['uid'],
                "owner_gid": file_dict['gid'],
                "owner_name": file_dict['user'] or None,
                "owner_group": file_dict['group'] or None,
                "file_mode": file_dict['mode'] or None,
                "file_target": file_dict['target'] or None,
                "target_type": file_dict['target_type'] or None,
                "md5_digest": file_dict['md5'] or None,
                "sha256_digest": file_dict['sha256'] or None,
                "file_info": file_dict['info'] or None,
                "file_perm_mode": file_dict['perm'] or None,
                "origin": src.name,
            }

            objects.append(file_rec)

            files += 1

            if files % 50000 == 0:
                log.info(f"{files}")
                State.get_db_session().bulk_insert_mappings(
                    FileDetail, objects)
                State.get_db_session().flush()
                objects.clear()

        if objects:
            State.get_db_session().bulk_insert_mappings(FileDetail, objects)

        objects.clear()
        State.get_db_session().flush()
        State.get_db_session().commit()

        log.info('..done')
示例#16
0
文件: orm.py 项目: texnician/py_embed
def ComposeNodeQuery(*nodes):
    return select(["*"], from_obj=[alias(n.query) for n in nodes])
示例#17
0
文件: orm.py 项目: texnician/py_embed
print (u)
print u in session
# Session.remove()
session.close()
# u.fullname = 'Tang'
session = Session()
print u in session
print (2, session)

# session.add(u)
# session.commit()
# print(our_user)

from sqlalchemy.sql import select, join, alias

cnt1 = alias(select([func.count("*")]).where(User.id <= 2))
cnt2 = alias(select([func.count("*")]).where(User.id >= 100))
cnt3 = alias(select([func.count("*")]).where(User.id == 7))
# r = session.execute(select(['*'], from_obj=[cnt1, cnt2, cnt3]))


def InitData():
    ss = Session()
    c1 = Card()
    c1.cardid = 1
    c1.level = 5
    c2 = Card()
    c2.cardid = 1
    c2.level = 7
    c3 = Card()
    c3.cardid = 2
示例#18
0
 def _get_table_clause(self, tbl_clz):
     table_clause = sql.table(tbl_clz.name)
     table_clause.schema = tbl_clz.scheme
     return sql.alias(table_clause, tbl_clz.alias)
示例#19
0
 def execute(self, request, user, page="1", sort="score"):
     page = int(page)
     offset = (page - 1)*50
     order =  {"members" : (desc("ialliances_members"),),
               "size"  : (desc("ialliances_size"),),
               "value" : (desc("ialliances_value"),),
               "score" : (desc("ialliances_score"),),
               "avg_size"  : (desc("ialliances_avg_size"),),
               "avg_value" : (desc("ialliances_avg_value"),),
               "avg_score" : (desc("ialliances_avg_score"),),
               "t10s"  : (desc("ialliances_t10s"),),
               "t50s"  : (desc("ialliances_t50s"),),
               "t100s" : (desc("ialliances_t100s"),),
               "t200s" : (desc("ialliances_t200s"),),
               "t10v"  : (desc("ialliances_t10v"),),
               "t50v"  : (desc("ialliances_t50v"),),
               "t100v" : (desc("ialliances_t100v"),),
               "t200v" : (desc("ialliances_t200v"),),
               } 
     if sort not in order.keys():
         sort = "score"
     order = order.get(sort)
     
     members = count().label("members")
     size = sum(Planet.size).label("size")
     value = sum(Planet.value).label("value")
     score = sum(Planet.score).label("score")
     avg_size = size.op("/")(members).label("avg_size")
     avg_value = value.op("/")(members).label("avg_value")
     avg_score = score.op("/")(members).label("avg_score")
     t10s = count(case(whens=((Planet.score_rank <= 10 ,1),), else_=None)).label("t10s")
     t50s = count(case(whens=((Planet.score_rank <= 50 ,1),), else_=None)).label("t50s")
     t100s = count(case(whens=((Planet.score_rank <= 100 ,1),), else_=None)).label("t100s")
     t200s = count(case(whens=((Planet.score_rank <= 200 ,1),), else_=None)).label("t200s")
     t10v = count(case(whens=((Planet.value_rank <= 10 ,1),), else_=None)).label("t10v")
     t50v = count(case(whens=((Planet.value_rank <= 50 ,1),), else_=None)).label("t50v")
     t100v = count(case(whens=((Planet.value_rank <= 100 ,1),), else_=None)).label("t100v")
     t200v = count(case(whens=((Planet.value_rank <= 200 ,1),), else_=None)).label("t200v")
     
     alliance1 = aliased(Alliance)
     Q = session.query(size, value, score,
                       avg_size, avg_value, avg_score,
                       t10s, t50s, t100s, t200s,
                       t10v, t50v, t100v, t200v,
                       members,
                       alliance1.id,
                       )
     Q = Q.join(Planet.intel)
     Q = Q.join((alliance1, Intel.alliance,))
     Q = Q.filter(Planet.active == True)
     Q = Q.group_by(alliance1.id)
     ialliances = alias(Q.subquery(), "ialliances")
     
     alliance2 = aliased(Alliance)
     Q = session.query(alliance2.name, alliance2.members)
     Q = Q.add_columns(ialliances)
     Q = Q.filter(alliance2.id == ialliances.c.id)
     
     count_ = Q.count()
     pages = count_/50 + int(count_%50 > 0)
     pages = range(1, 1+pages)
     
     for o in order:
         Q = Q.order_by(o)
     Q = Q.limit(50).offset(offset)
     return render("ialliances.tpl", request, alliances=Q.all(), offset=offset, pages=pages, page=page, sort=sort)
示例#20
0
def get_messages_backend(request: HttpRequest, user_profile: UserProfile,
                         anchor_val: Optional[str]=REQ(
                             'anchor', str_validator=check_string, default=None),
                         num_before: int=REQ(converter=to_non_negative_int),
                         num_after: int=REQ(converter=to_non_negative_int),
                         narrow: OptionalNarrowListT=REQ('narrow', converter=narrow_parameter, default=None),
                         use_first_unread_anchor_val: bool=REQ('use_first_unread_anchor',
                                                               validator=check_bool, default=False),
                         client_gravatar: bool=REQ(validator=check_bool, default=False),
                         apply_markdown: bool=REQ(validator=check_bool, default=True)) -> HttpResponse:
    anchor = parse_anchor_value(anchor_val, use_first_unread_anchor_val)
    if num_before + num_after > MAX_MESSAGES_PER_FETCH:
        return json_error(_("Too many messages requested (maximum {}).").format(
            MAX_MESSAGES_PER_FETCH,
        ))

    if user_profile.realm.email_address_visibility != Realm.EMAIL_ADDRESS_VISIBILITY_EVERYONE:
        # If email addresses are only available to administrators,
        # clients cannot compute gravatars, so we force-set it to false.
        client_gravatar = False

    include_history = ok_to_include_history(narrow, user_profile)
    if include_history:
        # The initial query in this case doesn't use `zerver_usermessage`,
        # and isn't yet limited to messages the user is entitled to see!
        #
        # This is OK only because we've made sure this is a narrow that
        # will cause us to limit the query appropriately later.
        # See `ok_to_include_history` for details.
        need_message = True
        need_user_message = False
    elif narrow is None:
        # We need to limit to messages the user has received, but we don't actually
        # need any fields from Message
        need_message = False
        need_user_message = True
    else:
        need_message = True
        need_user_message = True

    query, inner_msg_id_col = get_base_query_for_search(
        user_profile=user_profile,
        need_message=need_message,
        need_user_message=need_user_message,
    )

    query, is_search = add_narrow_conditions(
        user_profile=user_profile,
        inner_msg_id_col=inner_msg_id_col,
        query=query,
        narrow=narrow,
    )

    if narrow is not None:
        # Add some metadata to our logging data for narrows
        verbose_operators = []
        for term in narrow:
            if term['operator'] == "is":
                verbose_operators.append("is:" + term['operand'])
            else:
                verbose_operators.append(term['operator'])
        request._log_data['extra'] = "[{}]".format(",".join(verbose_operators))

    sa_conn = get_sqlalchemy_connection()

    if anchor is None:
        # The use_first_unread_anchor code path
        anchor = find_first_unread_anchor(
            sa_conn,
            user_profile,
            narrow,
        )

    anchored_to_left = (anchor == 0)

    # Set value that will be used to short circuit the after_query
    # altogether and avoid needless conditions in the before_query.
    anchored_to_right = (anchor >= LARGER_THAN_MAX_MESSAGE_ID)
    if anchored_to_right:
        num_after = 0

    first_visible_message_id = get_first_visible_message_id(user_profile.realm)
    query = limit_query_to_range(
        query=query,
        num_before=num_before,
        num_after=num_after,
        anchor=anchor,
        anchored_to_left=anchored_to_left,
        anchored_to_right=anchored_to_right,
        id_col=inner_msg_id_col,
        first_visible_message_id=first_visible_message_id,
    )

    main_query = alias(query)
    query = select(main_query.c, None, main_query).order_by(column("message_id").asc())
    # This is a hack to tag the query we use for testing
    query = query.prefix_with("/* get_messages */")
    rows = list(sa_conn.execute(query).fetchall())

    query_info = post_process_limited_query(
        rows=rows,
        num_before=num_before,
        num_after=num_after,
        anchor=anchor,
        anchored_to_left=anchored_to_left,
        anchored_to_right=anchored_to_right,
        first_visible_message_id=first_visible_message_id,
    )

    rows = query_info['rows']

    # The following is a little messy, but ensures that the code paths
    # are similar regardless of the value of include_history.  The
    # 'user_messages' dictionary maps each message to the user's
    # UserMessage object for that message, which we will attach to the
    # rendered message dict before returning it.  We attempt to
    # bulk-fetch rendered message dicts from remote cache using the
    # 'messages' list.
    message_ids: List[int] = []
    user_message_flags: Dict[int, List[str]] = {}
    if include_history:
        message_ids = [row[0] for row in rows]

        # TODO: This could be done with an outer join instead of two queries
        um_rows = UserMessage.objects.filter(user_profile=user_profile,
                                             message__id__in=message_ids)
        user_message_flags = {um.message_id: um.flags_list() for um in um_rows}

        for message_id in message_ids:
            if message_id not in user_message_flags:
                user_message_flags[message_id] = ["read", "historical"]
    else:
        for row in rows:
            message_id = row[0]
            flags = row[1]
            user_message_flags[message_id] = UserMessage.flags_list_for_flags(flags)
            message_ids.append(message_id)

    search_fields: Dict[int, Dict[str, str]] = dict()
    if is_search:
        for row in rows:
            message_id = row[0]
            (topic_name, rendered_content, content_matches, topic_matches) = row[-4:]

            try:
                search_fields[message_id] = get_search_fields(rendered_content, topic_name,
                                                              content_matches, topic_matches)
            except UnicodeDecodeError as err:  # nocoverage
                # No coverage for this block since it should be
                # impossible, and we plan to remove it once we've
                # debugged the case that makes it happen.
                raise Exception(str(err), message_id, narrow)

    message_list = messages_for_ids(
        message_ids=message_ids,
        user_message_flags=user_message_flags,
        search_fields=search_fields,
        apply_markdown=apply_markdown,
        client_gravatar=client_gravatar,
        allow_edit_history=user_profile.realm.allow_edit_history,
    )

    statsd.incr('loaded_old_messages', len(message_list))

    ret = dict(
        messages=message_list,
        result='success',
        msg='',
        found_anchor=query_info['found_anchor'],
        found_oldest=query_info['found_oldest'],
        found_newest=query_info['found_newest'],
        history_limited=query_info['history_limited'],
        anchor=anchor,
    )
    return json_success(ret)
示例#21
0
    def _load_tree_rows(self, conn, where, order_by, parent_id):
        """Load rows as a tree."""
        if where is not None:
            # FIXME: If we have a where clause, we cant load the results lazily
            # because, we don't know if a row's children/grandchildren/etc will
            # match.  If this optimization (loading the leafs and the necessary
            # parents until the root) good enough?
            children = {}
            node_mapper = {}

            def load_rows(where_):
                query = self.select(
                    conn, self.table, columns=self.table.columns,
                    where=where_, order_by=order_by)
                for row in query:
                    row_id = row[self.id_column_idx]
                    if row_id in node_mapper:
                        continue

                    c_list = children.setdefault(
                        row[self.parent_column_idx], [])
                    node = Node(data=row)
                    c_list.append(node)
                    node_mapper[row_id] = node

            load_rows(where)
            if not children:
                return

            # Load parents incrementally until we are left with the root
            while children.keys() != [None]:
                parents_to_load = []
                for parent, c_list in children.items():
                    if parent is None:
                        continue

                    node = node_mapper.get(parent, None)
                    if node is None:
                        parents_to_load.append(parent)
                        continue

                    node.extend(c_list)
                    node.children_len = len(node)
                    del children[parent]

                if parents_to_load:
                    where = self.table.columns[self.ID_COLUMN].in_(
                        parents_to_load)
                    load_rows(where)

            for node in children[None]:
                yield node
        else:
            # If there's no where clause, we can load the results lazily
            where = self.table.columns[self.PARENT_ID_COLUMN] == parent_id

            if self.CHILDREN_LEN_COLUMN is None:
                count_table = alias(self.table, '__count')
                # We could use the comparison between the columns, but that would
                # make sqlalchemy add self.table in the FROM clause, which
                # would produce wrong results.
                count_where = '%s.%s = %s.%s' % (
                    count_table.name, self.PARENT_ID_COLUMN,
                    self.table.name, self.ID_COLUMN)
                count_select = select(
                    [func.count(1)],
                    whereclause=count_where, from_obj=[count_table])

                columns = self.table.columns.values()
                # We have to compile this here or else sqlalchemy would put
                # this inside the FROM part.
                columns.append('(%s)' % (_compile(count_select), ))
                extra_count_col = True
            else:
                columns = self.table.columns
                extra_count_col = False

            query = self.select(
                conn, self.table, columns=columns,
                where=where, order_by=order_by)

            for row in query:
                if extra_count_col:
                    children_len = row.pop(-1)
                else:
                    children_len = row[self.children_len_column_idx]

                yield Node(data=row, children_len=children_len)