Пример #1
0
        public Task Run()
        {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine("INIT INDEX\n");
            Console.ResetColor();

            Console.WriteLine(
                $"Database name: {_dbName}\n" +
                $"Database type: {_dbType}\n");

            Serilog.Log.Information("INIT INDEX");
            string connString = string.Format(
                _options.Configuration[$"ConnectionStrings:{_dbType}"], _dbName);
            ITableInitializer initializer;

            switch (_dbType.ToLowerInvariant())
            {
            case "mysql":
                initializer = new MySqlTableInitializer(
                    new MySqlDbConnectionFactory(connString));
                break;

            case "pgsql":
                initializer = new PgSqlTableInitializer(
                    new PgSqlDbConnectionFactory(connString));
                break;

            default:
                throw new ArgumentException("Invalid db type: " + _dbType);
            }

            Console.Write("Initializing...");
            initializer.Initialize(_clear);
            Console.WriteLine(" completed.");

            return(Task.CompletedTask);
        }
Пример #2
0
        public async Task Run()
        {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine("BUILD INDEX\n");
            Console.ResetColor();

            Console.WriteLine(
                $"Profile path: {_profilePath}\n" +
                $"Database name: {_dbName}\n" +
                $"Database type: {_dbType}\n");

            Serilog.Log.Information("BUILD INDEX");
            IIndexBuilderFactory factory = null;
            string connString            = string.Format(
                _options.Configuration[$"ConnectionStrings:{_dbType}"], _dbName);
            ITableInitializer initializer = null;

            switch (_dbType.ToLowerInvariant())
            {
            case "mysql":
                factory = new MySqlIndexBuilderFactory(
                    LoadText(_profilePath),
                    connString);
                initializer = new MySqlTableInitializer(
                    new MySqlDbConnectionFactory(connString));
                break;

            case "pgsql":
                factory = new PgSqlIndexBuilderFactory(
                    LoadText(_profilePath),
                    connString);
                initializer = new PgSqlTableInitializer(
                    new PgSqlDbConnectionFactory(connString));
                break;

            default:
                throw new ArgumentException("Invalid db type: " + _dbType);
            }
            factory.BufferSize = _bufferSize;

            initializer.Initialize(_clear);

            ProgressBar mainBar = new ProgressBar(100, null, new ProgressBarOptions
            {
                DisplayTimeInRealTime = true,
                EnableTaskBarProgress = true
            });
            ProgressBarOptions childBarOptionns = new ProgressBarOptions
            {
                DisplayTimeInRealTime = false,
                CollapseWhenFinished  = true
            };
            Dictionary <string, ChildProgressBar> childBars =
                new Dictionary <string, ChildProgressBar>();
            Regex r = new Regex(@"^\[([^]]+)\]", RegexOptions.Compiled);

            foreach (DocumentDefinition document in factory.Profile.Documents)
            {
                using (IndexBuilder builder = factory.GetBuilder(null, _options.Logger))
                {
                    builder.PartitionCount   = _partitionCount;
                    builder.MinPartitionSize = _minPartitionSize;
                    builder.RecordLimit      = _recordLimit;

                    await builder.BuildAsync(document.Id, CancellationToken.None,
                                             new Progress <ProgressReport>(report =>
                    {
                        IProgressBar bar = mainBar;
                        Match m = r.Match(report.Message ?? "");
                        if (m.Success)
                        {
                            if (!childBars.ContainsKey(m.Groups[1].Value))
                            {
                                childBars[m.Groups[1].Value] =
                                    mainBar.Spawn(100, m.Groups[1].Value,
                                                  childBarOptionns);
                            }
                            bar = childBars[m.Groups[1].Value];
                        }
                        bar.Tick(report.Percent, report.Message);
                    }));
                }
            }
        }