public SqlServerStore(string connectionStringOrConnectionStringName)
        {
            var fromConfig = ConfigurationManager.ConnectionStrings[connectionStringOrConnectionStringName];

            if (fromConfig != null)
            {
                _connectionString = fromConfig.ConnectionString;
            }
            else
            {
                _connectionString = connectionStringOrConnectionStringName;
            }


            Exception outConn;

            if (!ConnectionHelper.TestConnection(_connectionString, out outConn))
            {
                throw new ArgumentNullException("connection", outConn);
            }

            _pageIdProvider = new CachedPageIdProvider(new SqlPageIdProvider(_connectionString));

            _requestsWriter = new RequestsWriter(_connectionString, _pageIdProvider);
            _requestsReader = new RequestsReader(_connectionString);

            _allPagesStore     = new AllPagesStore(_connectionString, _pageIdProvider);
            _distributionStore = new DistributionStore(_connectionString, _pageIdProvider, _requestsReader);
            _trendStore        = new TrendStore(_connectionString, _pageIdProvider, _requestsReader);

            _scheduler = new Scheduler(_allPagesStore, _distributionStore, _trendStore, this);
        }
        /// <remarks>
        /// * Validation is done by running the loop in parallel using 'Parallel.For(..'.
        /// * Keys are generated in clustered distribution using 'Guid(a,b,c,d,e,f,g,h,j,k)' by changing the 'c'.
        /// The sample size is run twice, first time in order to populate and second time to compare with the
        /// results of the first run.
        /// </remarks>
        public static DistributionStore<int> ShouldGetPartitionsForKeys(this IPartitionConnectionProvider provider, short sampleSize)
        {
            var partitionDistribution = new DistributionStore<int>();

            var partitionMap = new ConcurrentDictionary<Guid, int>();

            // should populate (most likely as there is only slight chance of clashing with keys from other specs) & return
            Parallel.For(0, sampleSize, i => 
            {
                var key = new Guid(22, 43, (short) i, 1, 2, 3, 4, 5, 6, 7, 8);
                var partition = provider.GetConnection(key).Connection.ExtractPartitionFromConnection();
                partitionMap[key] = partition;
                partitionDistribution.Add(partition);
            });

            // should return already existing
            Parallel.For(0, sampleSize, i => 
            {
                var key = new Guid(22, 43, (short) i, 1, 2, 3, 4, 5, 6, 7, 8);
                var partition = provider.GetConnection(key).Connection.ExtractPartitionFromConnection();
                partitionMap.ShouldContainKeyValue(key, partition);
            });

            return partitionDistribution;
        }