示例#1
0
        public void Database_PartitionedBuildAndRead()
        {
            long currentFileLimit = BinaryTableWriter.ColumnFileSizeLimit;

            try
            {
                string tablePath = @"Table\MultiPartition\Full\2018.06.06 00.00.00Z";
                int    length    = 10 * 1024 * 1024;

                // Set limit to 10MB
                BinaryTableWriter.ColumnFileSizeLimit = length;

                // Build a table with 10 million integers
                IXTable table = SampleDatabase.XDatabaseContext.FromArrays(length)
                                .WithColumn("ID", Enumerable.Range(0, length).ToArray())
                                .Query($@"write ""{tablePath}""", SampleDatabase.XDatabaseContext);

                table.RunAndDispose();

                // Verify there are multiple partitions created (four should exactly fit the rows)
                Assert.IsTrue(SampleDatabase.XDatabaseContext.StreamProvider.Exists($@"{tablePath}\\0\\Schema.csv"));
                Assert.IsTrue(SampleDatabase.XDatabaseContext.StreamProvider.Exists($@"{tablePath}\\1\\Schema.csv"));
                Assert.IsTrue(SampleDatabase.XDatabaseContext.StreamProvider.Exists($@"{tablePath}\\2\\Schema.csv"));
                Assert.IsTrue(SampleDatabase.XDatabaseContext.StreamProvider.Exists($@"{tablePath}\\3\\Schema.csv"));

                // Verify no extra partitions
                Assert.IsFalse(SampleDatabase.XDatabaseContext.StreamProvider.Exists($@"{tablePath}\\4\\Schema.csv"));

                // Verify Partitions.csv at root (only)
                Assert.IsTrue(SampleDatabase.XDatabaseContext.StreamProvider.Exists($@"{tablePath}\\Partitions.csv"));
                Assert.IsFalse(SampleDatabase.XDatabaseContext.StreamProvider.Exists($@"{tablePath}\\2\\Partitions.csv"));

                // Read the table; verify 10M rows reported
                Assert.AreEqual(length, SampleDatabase.XDatabaseContext.Query("read MultiPartition").RunAndDispose().RowCount);

                // Test a where clause crossing partitions
                Assert.AreEqual(5242880, SampleDatabase.XDatabaseContext.Query("read MultiPartition\r\nwhere [ID] < 5242880").RunAndDispose().RowCount);
            }
            finally
            {
                BinaryTableWriter.ColumnFileSizeLimit = currentFileLimit;
            }
        }