コード例 #1
0
        public async Task <IEnumerable <BallotOperation> > GetBallots(
            AccountParameter sender,
            Int32Parameter level,
            DateTimeParameter timestamp,
            Int32Parameter epoch,
            Int32Parameter period,
            ProtocolParameter proposal,
            SortParameter sort,
            OffsetParameter offset,
            int limit,
            Symbols quote)
        {
            var sql = new SqlBuilder(@"
                SELECT      o.""Id"", o.""Level"", o.""Timestamp"", o.""OpHash"", o.""SenderId"", o.""Rolls"", o.""Vote"", o.""Epoch"", o.""Period"",
                            b.""Hash"",
                            proposal.""Hash"" as ""ProposalHash"", proposal.""Metadata"" ->> 'alias' as ""ProposalAlias"",
                            period.""Kind"", period.""FirstLevel"", period.""LastLevel""
                FROM        ""BallotOps"" as o
                INNER JOIN  ""Blocks"" as b ON b.""Level"" = o.""Level""
                INNER JOIN  ""Proposals"" as proposal ON proposal.""Id"" = o.""ProposalId""
                INNER JOIN  ""VotingPeriods"" as period ON period.""Index"" = o.""Period""
                ")
                      .Filter("SenderId", sender)
                      .FilterA(@"o.""Level""", level)
                      .FilterA(@"o.""Timestamp""", timestamp)
                      .FilterA(@"o.""Epoch""", epoch)
                      .FilterA(@"o.""Period""", period)
                      .FilterA(@"proposal.""Hash""", proposal)
                      .Take(sort, offset, limit, x => x == "level" ? ("Id", "Level") : ("Id", "Id"), "o");

            using var db = GetConnection();
            var rows = await db.QueryAsync(sql.Query, sql.Params);

            return(rows.Select(row => new BallotOperation
            {
                Id = row.Id,
                Level = row.Level,
                Block = row.Hash,
                Timestamp = row.Timestamp,
                Hash = row.OpHash,
                Period = new PeriodInfo
                {
                    Index = row.Period,
                    Epoch = row.Epoch,
                    Kind = PeriodKinds.ToString(row.Kind),
                    FirstLevel = row.FirstLevel,
                    LastLevel = row.LastLevel
                },
                Proposal = new ProposalAlias
                {
                    Hash = row.ProposalHash,
                    Alias = row.ProposalAlias
                },
                Delegate = Accounts.GetAlias(row.SenderId),
                Rolls = row.Rolls,
                Vote = Votes.ToString(row.Vote),
                Quote = Quotes.Get(quote, row.Level)
            }));
        }
コード例 #2
0
        public async Task <IEnumerable <ProposalOperation> > GetProposals(string hash, Symbols quote)
        {
            var sql = @"
                SELECT      o.""Id"", o.""Level"", o.""Timestamp"", o.""SenderId"", o.""Rolls"", o.""Duplicated"", o.""Epoch"", o.""Period"",
                            b.""Hash"",
                            proposal.""Hash"" as ""ProposalHash"", proposal.""Metadata"" ->> 'alias' as ""ProposalAlias"",
                            period.""Kind"", period.""FirstLevel"", period.""LastLevel""
                FROM        ""ProposalOps"" as o
                INNER JOIN  ""Blocks"" as b 
                        ON  b.""Level"" = o.""Level""
                INNER JOIN  ""Proposals"" as proposal
                        ON  proposal.""Id"" = o.""ProposalId""
                INNER JOIN  ""VotingPeriods"" as period
                        ON  period.""Index"" = o.""Period""
                WHERE       o.""OpHash"" = @hash::character(51)
                ORDER BY    o.""Id""";

            using var db = GetConnection();
            var rows = await db.QueryAsync(sql, new { hash });

            return(rows.Select(row => new ProposalOperation
            {
                Id = row.Id,
                Level = row.Level,
                Block = row.Hash,
                Timestamp = row.Timestamp,
                Hash = hash,
                Rolls = row.Rolls,
                Duplicated = row.Duplicated,
                Period = new PeriodInfo
                {
                    Index = row.Period,
                    Epoch = row.Epoch,
                    Kind = PeriodKinds.ToString(row.Kind),
                    FirstLevel = row.FirstLevel,
                    LastLevel = row.LastLevel
                },
                Proposal = new ProposalAlias
                {
                    Hash = row.ProposalHash,
                    Alias = row.ProposalAlias
                },
                Delegate = Accounts.GetAlias(row.SenderId),
                Quote = Quotes.Get(quote, row.Level)
            }));
        }
コード例 #3
0
        public async Task <object[]> GetProposals(
            AccountParameter sender,
            Int32Parameter level,
            DateTimeParameter timestamp,
            Int32Parameter epoch,
            Int32Parameter period,
            ProtocolParameter proposal,
            BoolParameter duplicated,
            SortParameter sort,
            OffsetParameter offset,
            int limit,
            string field,
            Symbols quote)
        {
            var columns = new HashSet <string>(4);
            var joins   = new HashSet <string>(3);

            switch (field)
            {
            case "id": columns.Add(@"o.""Id"""); break;

            case "level": columns.Add(@"o.""Level"""); break;

            case "timestamp": columns.Add(@"o.""Timestamp"""); break;

            case "hash": columns.Add(@"o.""OpHash"""); break;

            case "delegate": columns.Add(@"o.""SenderId"""); break;

            case "rolls": columns.Add(@"o.""Rolls"""); break;

            case "duplicated": columns.Add(@"o.""Duplicated"""); break;

            case "proposal":
                columns.Add(@"proposal.""Hash"" as ""ProposalHash""");
                columns.Add(@"proposal.""Metadata"" ->> 'alias' as ""ProposalAlias""");
                joins.Add(@"INNER JOIN ""Proposals"" as proposal ON proposal.""Id"" = o.""ProposalId""");
                break;

            case "period":
                columns.Add(@"o.""Epoch""");
                columns.Add(@"o.""Period""");
                columns.Add(@"period.""Kind""");
                columns.Add(@"period.""FirstLevel""");
                columns.Add(@"period.""LastLevel""");
                joins.Add(@"INNER JOIN ""VotingPeriods"" as period ON period.""Index"" = o.""Period""");
                break;

            case "block":
                columns.Add(@"b.""Hash""");
                joins.Add(@"INNER JOIN ""Blocks"" as b ON b.""Level"" = o.""Level""");
                break;

            case "quote": columns.Add(@"o.""Level"""); break;
            }

            if (period != null)
            {
                joins.Add(@"INNER JOIN ""VotingPeriods"" as period ON period.""Index"" = o.""Period""");
            }

            if (proposal != null)
            {
                joins.Add(@"INNER JOIN ""Proposals"" as proposal ON proposal.""Id"" = o.""ProposalId""");
            }

            if (columns.Count == 0)
            {
                return(Array.Empty <object>());
            }

            var sql = new SqlBuilder($@"SELECT {string.Join(',', columns)} FROM ""ProposalOps"" as o {string.Join(' ', joins)}")
                      .Filter("SenderId", sender)
                      .FilterA(@"o.""Level""", level)
                      .FilterA(@"o.""Timestamp""", timestamp)
                      .FilterA(@"o.""Duplicated""", duplicated)
                      .FilterA(@"o.""Epoch""", epoch)
                      .FilterA(@"o.""Period""", period)
                      .FilterA(@"proposal.""Hash""", proposal)
                      .Take(sort, offset, limit, x => x == "level" ? ("Id", "Level") : ("Id", "Id"), "o");

            using var db = GetConnection();
            var rows = await db.QueryAsync(sql.Query, sql.Params);

            //TODO: optimize memory allocation
            var result = new object[rows.Count()];
            var j      = 0;

            switch (field)
            {
            case "id":
                foreach (var row in rows)
                {
                    result[j++] = row.Id;
                }
                break;

            case "level":
                foreach (var row in rows)
                {
                    result[j++] = row.Level;
                }
                break;

            case "block":
                foreach (var row in rows)
                {
                    result[j++] = row.Hash;
                }
                break;

            case "timestamp":
                foreach (var row in rows)
                {
                    result[j++] = row.Timestamp;
                }
                break;

            case "hash":
                foreach (var row in rows)
                {
                    result[j++] = row.OpHash;
                }
                break;

            case "rolls":
                foreach (var row in rows)
                {
                    result[j++] = row.Rolls;
                }
                break;

            case "duplicated":
                foreach (var row in rows)
                {
                    result[j++] = row.Duplicated;
                }
                break;

            case "period":
                foreach (var row in rows)
                {
                    result[j++] = new PeriodInfo
                    {
                        Index      = row.Period,
                        Epoch      = row.Epoch,
                        Kind       = PeriodKinds.ToString(row.Kind),
                        FirstLevel = row.FirstLevel,
                        LastLevel  = row.LastLevel
                    }
                }
                ;
                break;

            case "proposal":
                foreach (var row in rows)
                {
                    result[j++] = new ProposalAlias
                    {
                        Hash  = row.ProposalHash,
                        Alias = row.ProposalAlias
                    }
                }
                ;
                break;

            case "delegate":
                foreach (var row in rows)
                {
                    result[j++] = await Accounts.GetAliasAsync(row.SenderId);
                }
                break;

            case "quote":
                foreach (var row in rows)
                {
                    result[j++] = Quotes.Get(quote, row.Level);
                }
                break;
            }

            return(result);
        }