public ResourceDataDistribution?GetResourceDataDistribution(int revision)
        {
            var viewName = GetResourceName();

            using var db = new SqliteConnection($"Data Source={FilePath}");
            db.Open();
            using var t = db.BeginTransaction();

            var tableInfoList = db.Query <SqliteTableInfo>(SqliteBuilder.GetTableInfo(), new { name = $"{viewName}%" }, t)
                                .Where(x => !x.name.Contains("_Search"))
                                .AsList() ?? throw new NullReferenceException();

            foreach (var tableInfo in tableInfoList)
            {
                var revisionString = Regex.Split(tableInfo.name, "([0-9])+$",
                                                 RegexOptions.IgnoreCase | RegexOptions.Compiled)[1];

                if (!int.TryParse(revisionString, out var tableRevision) || tableRevision != revision)
                {
                    continue;
                }

                var count  = db.QuerySingle <long>($"SELECT COUNT(*) FROM \"{tableInfo.name}\"", transaction: t);
                var result = new ResourceDataDistribution {
                    Partition = tableInfo.name, RowCount = count
                };
                return(result);
            }

            return(default);
        private void Visit(IDbConnection db, IDbTransaction t)
        {
            var viewName = GetResourceName();

            var tableInfoList = db.Query <SqliteTableInfo>(SqliteBuilder.GetTableInfo(), new { name = $"{viewName}%" }, t)
                                .Where(x => !x.name.Contains("_Search"))
                                .AsList() ?? throw new NullReferenceException();

            int revision;

            if (tableInfoList.Count == 0)
            {
                revision = 1;
                Visit(db, t, revision, tableInfoList);
            }
            else
            {
                var tableInfo = tableInfoList[0];

                var revisionString = Regex.Split(tableInfo.name, "([0-9])+$",
                                                 RegexOptions.IgnoreCase | RegexOptions.Compiled)[1];

                if (!int.TryParse(revisionString, out revision))
                {
                    throw new FormatException(_localizer.GetString("invalid revision number"));
                }

                if (_revision <= revision)
                {
                    return;
                }

                Visit(db, t, _revision, tableInfoList);
            }
        }