예제 #1
0
        /// <summary>
        ///     Creates the scan specification.
        /// </summary>
        /// <returns>
        ///     The scan spec.
        /// </returns>
        public ScanSpec CreateScanSpec()
        {
            var scanSpec = new ScanSpec {
                MaxVersions = 1, ScanAndFilter = true
            };

            foreach (var entityScanTarget in this.EntityScanTargets)
            {
                var key = entityScanTarget.Key;
                if (!string.IsNullOrEmpty(key.ColumnFamily))
                {
                    if (key.ColumnQualifier == null)
                    {
                        scanSpec.AddColumn(key.ColumnFamily);
                    }
                    else
                    {
                        var sb = new StringBuilder();
                        sb.Append(key.ColumnFamily);
                        sb.Append(":");
                        sb.Append(key.ColumnQualifier);
                        scanSpec.AddColumn(sb.ToString());
                    }
                }

                scanSpec.AddRow(key.Row);
            }

            return(scanSpec);
        }
예제 #2
0
        public void FetchByScanSpec()
        {
            var ec1 = new EntityC {
                A = new EntityA(), B = new EntityB(), X = new EntityX(), Y = new EntityY()
            };

            TestBase.TestSerialization(ec1);

            var ex21 = new EntityX2();

            TestBase.TestSerialization(ex21);

            using (var em = Emf.CreateEntityManager())
            {
                em.Persist(ec1);
                em.Persist(ex21);
            }

            using (var em = Emf.CreateEntityManager())
            {
                var _ec = em.Fetch <EntityC>(new ScanSpec(ec1.Id));
                Assert.IsNotNull(_ec);
                Assert.AreEqual(1, _ec.Count());
                Assert.AreEqual(ec1, _ec.First());

                var ss = new ScanSpec();
                ss.AddColumn("a");
                var _ex = em.Fetch <EntityXBase>(ss);
                Assert.IsNotNull(_ex);
                Assert.AreEqual(2, _ex.Count());
                Assert.AreEqual(ec1.X, _ex.OfType <EntityX>().First());
                Assert.AreEqual(ex21, _ex.OfType <EntityX2>().First());
            }
        }
예제 #3
0
        /// <summary>
        ///     Gets the scan spec for the type specified.
        /// </summary>
        /// <param name="entityType">
        ///     The entity type.
        /// </param>
        /// <returns>
        ///     The scan spec.
        /// </returns>
        public ScanSpec ScanSpecForType(Type entityType)
        {
            if (entityType == null)
            {
                throw new ArgumentNullException(nameof(entityType));
            }

            var entityReference = this.EntityReferenceForType(entityType);

            if (entityReference == null)
            {
                throw new PersistenceException(string.Format(CultureInfo.InvariantCulture, @"{0} is not a valid entity",
                                                             entityType));
            }

            entityReference.EstablishColumnSets(() => this.ColumnNames(entityReference));
            var scanSpec = new ScanSpec {
                MaxVersions = 1
            };

            scanSpec.AddColumn(entityReference.ColumnSet);
            if (scanSpec.ColumnCount == 0)
            {
                throw new PersistenceException(string.Format(CultureInfo.InvariantCulture, @"{0} is not a valid entity",
                                                             entityType));
            }

            return(scanSpec);
        }
예제 #4
0
        /// <summary>
        ///     Gets the merged scan spec for the types specified.
        /// </summary>
        /// <param name="entityTypes">
        ///     The query types.
        /// </param>
        /// <returns>
        ///     The merged scan spec.
        /// </returns>
        public ScanSpec ScanSpecForType(IEnumerable <Type> entityTypes)
        {
            if (entityTypes == null)
            {
                throw new ArgumentNullException(nameof(entityTypes));
            }

            var columnNames = new List <string>();

            foreach (var queryType in entityTypes)
            {
                var entityReference = this.EntityReferenceForType(queryType);
                if (entityReference == null)
                {
                    throw new PersistenceException(string.Format(CultureInfo.InvariantCulture,
                                                                 @"{0} is not a valid query type", queryType));
                }

                entityReference.EstablishColumnSets(() => this.ColumnNames(entityReference));
                columnNames.AddRange(entityReference.ColumnSet);
            }

            if (columnNames.Count > 5)
            {
                var registeredColumnNames = this.RegisteredColumnNames();

                foreach (var columnName in columnNames.ToList())
                {
                    var split = columnName.Split(':');
                    if (split.Length > 1)
                    {
                        ISet <string> columnQualifiers;
                        if (registeredColumnNames.TryGetValue(split[0], out columnQualifiers))
                        {
                            if (columnQualifiers.Remove(split[1]) && columnQualifiers.Count == 0)
                            {
                                columnNames.Add(split[0]);
                            }
                        }
                    }
                }
            }

            var scanSpec = new ScanSpec {
                MaxVersions = 1
            };

            scanSpec.AddColumn(ScanSpec.DistictColumn(columnNames));
            if (scanSpec.ColumnCount == 0)
            {
                throw new PersistenceException("Missing or invalid entity types");
            }

            return(scanSpec);
        }
예제 #5
0
        public void FetchByScanSpec()
        {
            var ec1 = new EntityC { A = new EntityA(), B = new EntityB(), X = new EntityX(), Y = new EntityY() };
            TestBase.TestSerialization(ec1);

            var ex21 = new EntityX2();
            TestBase.TestSerialization(ex21);

            using (var em = Emf.CreateEntityManager())
            {
                em.Persist(ec1);
                em.Persist(ex21);
            }

            using (var em = Emf.CreateEntityManager())
            {
                var _ec = em.Fetch<EntityC>(new ScanSpec(ec1.Id));
                Assert.IsNotNull(_ec);
                Assert.AreEqual(1, _ec.Count());
                Assert.AreEqual(ec1, _ec.First());

                var ss = new ScanSpec();
                ss.AddColumn("a");
                var _ex = em.Fetch<EntityXBase>(ss);
                Assert.IsNotNull(_ex);
                Assert.AreEqual(2, _ex.Count());
                Assert.AreEqual(ec1.X, _ex.OfType<EntityX>().First());
                Assert.AreEqual(ex21, _ex.OfType<EntityX2>().First());
            }
        }
예제 #6
0
        public void ScanTableRandomCells()
        {
            var random = new Random();
            const string Cf = "abcdefg";
            const int Count = 10000;
            using (var _table = EnsureTable("ScanTableRandomCells", Schema)) {
                var keys = new List<Key>(Count);
                using (var mutator = _table.CreateMutator()) {
                    for (var i = 0; i < Count; ++i) {
                        var key = new Key
                            {
                                Row = Guid.NewGuid().ToString(),
                                ColumnFamily = new string(new[] { Cf[random.Next(Cf.Length)] }),
                                ColumnQualifier = random.Next(Cf.Length).ToString(CultureInfo.InvariantCulture)
                            };
                        keys.Add(key);
                        mutator.Set(key, Encoding.GetBytes(key.Row));
                    }
                }

                for (var r = 0; r < 10; ++r) {
                    var countCells = 10 + random.Next(Count - 10);
                    var scanSpec = new ScanSpec();
                    foreach (var k in Shuffle(keys)) {
                        scanSpec.AddCell(k);
                        if (scanSpec.CellCount == countCells) {
                            break;
                        }
                    }

                    var comparer = new KeyComparer(false);
                    using (var scanner = _table.CreateScanner(scanSpec)) {
                        Assert.AreSame(scanSpec, scanner.ScanSpec);
                        var cell = new Cell();
                        var c = 0;
                        while( scanner.Move(cell) ) {
                            Assert.AreEqual(cell.Key.Row, Encoding.GetString(cell.Value));
                            Assert.IsTrue(comparer.Equals(scanSpec.Cells[c++], cell.Key));
                        }

                        Assert.AreEqual(scanSpec.CellCount, c);
                    }
                }

                for (var r = 0; r < 10; ++r) {
                    var countCells = 10 + random.Next(Count - 10);
                    var scanSpec = new ScanSpec();
                    foreach (var k in Shuffle(keys)) {
                        scanSpec.AddRow(k.Row);
                        if (scanSpec.RowCount == countCells) {
                            break;
                        }
                    }

                    using (var scanner = _table.CreateScanner(scanSpec)) {
                        Assert.AreSame(scanSpec, scanner.ScanSpec);
                        var cell = new Cell();
                        var c = 0;
                        while( scanner.Move(cell) ) {
                            Assert.AreEqual(cell.Key.Row, Encoding.GetString(cell.Value));
                            Assert.AreEqual(scanSpec.Rows[c++], cell.Key.Row);
                        }

                        Assert.AreEqual(scanSpec.RowCount, c);
                    }
                }

                for (var r = 0; r < 10; ++r) {
                    var rows = new HashSet<string>();
                    var countCells = 10 + random.Next(Count - 10);
                    var scanSpec = new ScanSpec(true);
                    foreach (var k in Shuffle(keys)) {
                        scanSpec.AddRow(k.Row);
                        rows.Add(k.Row);
                        if (scanSpec.RowCount == countCells) {
                            break;
                        }
                    }

                    using (var scanner = _table.CreateScanner(scanSpec)) {
                        Assert.AreSame(scanSpec, scanner.ScanSpec);
                        var cell = new Cell();
                        var c = 0;
                        while( scanner.Move(cell) ) {
                            Assert.AreEqual(cell.Key.Row, Encoding.GetString(cell.Value));
                            Assert.IsTrue(rows.Contains(cell.Key.Row));
                            ++c;
                        }

                        Assert.AreEqual(scanSpec.RowCount, c);
                    }
                }

                for (var r = 0; r < 10; ++r) {
                    var rows = new HashSet<string>();
                    var columnFamily = new string(new[] { Cf[random.Next(Cf.Length)] });
                    var columnQualifier = random.Next(Cf.Length).ToString(CultureInfo.InvariantCulture);
                    var countCells = 10 + random.Next(Count / 10);
                    var scanSpec = new ScanSpec { ScanAndFilter = true };
                    foreach (var k in Shuffle(keys).Where(k => k.ColumnFamily == columnFamily && k.ColumnQualifier == columnQualifier)) {
                        Assert.AreEqual(columnFamily, k.ColumnFamily);
                        Assert.AreEqual(columnQualifier, k.ColumnQualifier);
                        scanSpec.AddColumn(k.ColumnFamily + ":" + k.ColumnQualifier);
                        scanSpec.AddRow(k.Row);
                        rows.Add(k.Row);
                        if (scanSpec.RowCount == countCells) {
                            break;
                        }
                    }

                    using (var scanner = _table.CreateScanner(scanSpec)) {
                        Assert.AreSame(scanSpec, scanner.ScanSpec);
                        var cell = new Cell();
                        var c = 0;
                        while( scanner.Move(cell) ) {
                            Assert.AreEqual(cell.Key.Row, Encoding.GetString(cell.Value));
                            Assert.AreEqual(columnFamily, cell.Key.ColumnFamily);
                            Assert.AreEqual(columnQualifier, cell.Key.ColumnQualifier);
                            Assert.IsTrue(rows.Contains(cell.Key.Row));
                            ++c;
                        }

                        Assert.AreEqual(scanSpec.RowCount, c);
                    }
                }

                for (var r = 0; r < 10; ++r) {
                    var rows = new HashSet<string>();
                    var columnQualifier = random.Next(Cf.Length).ToString(CultureInfo.InvariantCulture);
                    var countCells = 10 + random.Next(Count / 10);
                    var scanSpec = new ScanSpec { ScanAndFilter = true };
                    foreach (var k in Shuffle(keys).Where(k => k.ColumnQualifier == columnQualifier)) {
                        Assert.AreEqual(columnQualifier, k.ColumnQualifier);
                        scanSpec.AddColumn(k.ColumnFamily + ":" + k.ColumnQualifier);
                        scanSpec.AddRow(k.Row);
                        rows.Add(k.Row);
                        if (scanSpec.RowCount == countCells) {
                            break;
                        }
                    }

                    using (var scanner = _table.CreateScanner(scanSpec)) {
                        Assert.AreSame(scanSpec, scanner.ScanSpec);
                        var cell = new Cell();
                        var c = 0;
                        while( scanner.Move(cell) ) {
                            Assert.AreEqual(cell.Key.Row, Encoding.GetString(cell.Value));
                            Assert.AreEqual(columnQualifier, cell.Key.ColumnQualifier);
                            Assert.IsTrue(rows.Contains(cell.Key.Row));
                            ++c;
                        }

                        Assert.AreEqual(scanSpec.RowCount, c);
                    }
                }

                using (var mutator = _table.CreateMutator()) {
                    var key = new Key { Row = "A", ColumnFamily = "a", ColumnQualifier = "1" };
                    mutator.Set(key, Encoding.GetBytes(key.Row));

                    key = new Key { Row = "B", ColumnFamily = "a", ColumnQualifier = "2" };
                    mutator.Set(key, Encoding.GetBytes(key.Row));

                    key = new Key { Row = "C", ColumnFamily = "c", ColumnQualifier = "3" };
                    mutator.Set(key, Encoding.GetBytes(key.Row));

                    key = new Key { Row = "D", ColumnFamily = "c", ColumnQualifier = "4" };
                    mutator.Set(key, Encoding.GetBytes(key.Row));

                    key = new Key { Row = "E", ColumnFamily = "b", ColumnQualifier = "5" };
                    mutator.Set(key, Encoding.GetBytes(key.Row));
                }

                {
                    var scanSpec = new ScanSpec { ScanAndFilter = true };
                    scanSpec.AddColumn("a:1");
                    scanSpec.AddColumn("a:2");
                    scanSpec.AddColumn("b:5");
                    scanSpec.AddColumn("c:3");
                    scanSpec.AddColumn("c:4");
                    scanSpec.AddRow("A");
                    scanSpec.AddRow("B");

                    using (var scanner = _table.CreateScanner(scanSpec)) {
                        Assert.AreSame(scanSpec, scanner.ScanSpec);
                        var cell = new Cell();
                        var c = 0;
                        while( scanner.Move(cell) ) {
                            Assert.AreEqual(cell.Key.Row, Encoding.GetString(cell.Value));
                            ++c;
                        }

                        Assert.AreEqual(scanSpec.RowCount, c);
                    }

                    scanSpec = new ScanSpec { ScanAndFilter = true };
                    scanSpec.AddColumn("a", "b:5", "c");
                    scanSpec.AddRow("A");
                    scanSpec.AddRow("C");
                    scanSpec.AddRow("E");

                    using (var scanner = _table.CreateScanner(scanSpec)) {
                        Assert.AreSame(scanSpec, scanner.ScanSpec);
                        var cell = new Cell();
                        var c = 0;
                        while( scanner.Move(cell) ) {
                            Assert.AreEqual(cell.Key.Row, Encoding.GetString(cell.Value));
                            ++c;
                        }

                        Assert.AreEqual(scanSpec.RowCount, c);
                    }
                }
            }
        }