예제 #1
0
        public async Task <User> GetAllUserInformation(int userId, string username)
        {
            try
            {
                using (MySqlConnection connection = Connection)
                {
                    string credIdQuery = "SELECT Id, Username FROM Credential WHERE Username = @username";
                    var    @idParam    = new {
                        Username = username
                    };
                    connection.Open();
                    Credential credential = await connection.QueryFirstOrDefaultAsync <Credential>(credIdQuery, idParam);

                    if (credential == null)
                    {
                        return(null);
                    }
                    string piiIdQuery  = "SELECT pii FROM User WHERE credentials = @credentialId";
                    var    @piiIdParam = new { credentialId = credential.Id };
                    int?   piiId       = await connection.QueryFirstOrDefaultAsync <int?>(piiIdQuery, @piiIdParam);

                    string piiQuery  = "SELECT * FROM PII WHERE id = @id";
                    var    @piiParam = new { id = piiId };
                    Pii    pii       = await connection.QueryFirstOrDefaultAsync <Pii>(piiQuery, @piiParam);

                    string userQuery   = "SELECT id, joindate, dateadded, dateconfirmed FROM User WHERE pii = @piiId AND credentials = @credentialId";
                    var    @userParams = new {
                        piiId        = pii.Id,
                        credentialId = credential.Id
                    };
                    User user = await connection.QueryFirstOrDefaultAsync <User>(userQuery, @userParams);

                    user.Pii        = pii;
                    user.Credential = credential;
                    return(user);
                }
            }
            catch (Exception err)
            {
                Console.WriteLine(TAG + err);
                return(null);
            }
        }
예제 #2
0
        public void TestBenchmark(int nV, int nE, int nQ, int nO, int seed, int queryType = 0, bool naive = false, int type = 1)
        {
            if (seed == 0)
            {
                seed = new Random().Next();
            }

            var swA  = new PerformanceMeasurement(10);
            var swD  = new PerformanceMeasurement(10);
            var swQ  = new PerformanceMeasurement(1);
            int hash = 0;

            int nD   = nO / 2;  // number of deletions
            int nA   = nO - nD; // number of additions
            int maxE = nV * (nV - 1) / 2;

            var rand  = new Random(seed);
            var rand2 = new Random(seed + 31);

            IConnGraph graph;

            swA.Start();
            if (naive)
            {
                graph = new NaiveConnGraph(SumAndMax.AUGMENTATION);
            }
            else
            {
                graph = new ConnGraph(SumAndMax.AUGMENTATION, (ConnGraphComponentStorageType)type);
            }
            swA.Stop();

            var V = new ConnVertex[nV];

            for (int i = 0; i < nV; i++)
            {
                V[i] = new ConnVertex(rand2);
                graph.SetVertexAugmentation(V[i], new SumAndMax(1, 1));
            }

            var E     = new HashSet <Pii>();
            var EList = new List <Pii>(nE);

            // for (int i = 1; i < nV; i++)
            // {
            //     graph.AddEdge(V[i - 1], V[i]);
            // }
            for (int i = 0; i < nE; i++)
            {
                AddRandomEdge();
            }
            // swA.Start();
            // graph.Optimize();
            // swA.Stop();
            _log.WriteLine($"Init time:   {swA}\n");
            swA.Reset();

            char[] O = new char[nO + nQ];
            for (int i = 0; i < nA; i++)
            {
                O[i] = 'a';
            }
            for (int i = nA; i < nO; i++)
            {
                O[i] = 'd';
            }
            for (int i = nO; i < nO + nQ; i++)
            {
                O[i] = 'q';
            }
            Shuffle(O, rand);

            foreach (char o in O)
            {
                switch (o)
                {
                case 'a':
                    AddRandomEdge();
                    break;

                case 'd':
                    DeleteRandomEdge();
                    break;

                case 'q':
                    switch (queryType)
                    {
                    case 0:
                        Query0();
                        break;

                    case 1:
                        Query1();
                        break;

                    case 2:
                        Query2();
                        break;
                    }
                    break;
                }
            }
            _log.WriteLine($"Add time:    {swA}");
            _log.WriteLine($"Delete time: {swD}");
            _log.WriteLine($"Query time:  {swQ}");
            _log.WriteLine("");
            _log.WriteLine($"hash: {hash}");

            void AddRandomEdge()
            {
                if (EList.Count == maxE)
                {
                    return;
                }

                while (true)
                {
                    int a1  = rand.Next(1, nV);
                    int b1  = rand.Next(0, a1);
                    var pii = new Pii(a1, b1);
                    if (E.Add(pii))
                    {
                        EList.Add(pii);
                        swA.Start();
                        graph.AddEdge(V[a1], V[b1]);
                        swA.Stop();
                        return;
                    }
                }
            }

            void DeleteRandomEdge()
            {
                int count = EList.Count;

                if (count == 0)
                {
                    return;
                }
                int i1  = rand.Next(0, count);
                var pii = EList[i1];

                E.Remove(pii);
                EList[i1] = EList[count - 1];
                EList.RemoveAt(count - 1);
                swD.Start();
                graph.RemoveEdge(V[pii.a], V[pii.b]);
                swD.Stop();
            }

            void Query0()
            {
                int a1 = rand.Next(1, nV);
                int b1 = rand.Next(0, a1);

                swQ.Start();
                bool result = graph.IsConnected(V[a1], V[b1]);

                swQ.Stop();

                hash = hash * 31 + (result ? 402653189 : 786433);
            }

            void Query1()
            {
                int a1 = rand.Next(0, nV);

                swQ.Start();
                var info = graph.GetComponentInfo(V[a1]);

                swQ.Stop();
                int result = ((SumAndMax)info.augmentation).sum;

                Assert.True(info.size == result);

                hash = hash * 31 + result;
            }

            void Query2()
            {
                swQ.Start();
                var components = graph.GetAllComponents();

                swQ.Stop();
                foreach (var component in components.OrderBy(x => x.size))
                {
                    // hash += component.size;
                    hash = hash * 31 + component.size;
                }
            }
        }