Posted on 17/01/2025 11:27:48
							
							
						 
							We do it something like below:
 
[AddInName("User Index Builder")]
public class 
    : IndexBuilderBase, IResumable
{
    private const string AddInParameterGroupName = "User Index Builder Settings";
    [AddInParameterGroup(AddInParameterGroupName), AddInParameter("HoursToUpdate"), AddInLabel("Hours to update"), AddInParameterEditor(typeof(NumberParameterEditor), "")]
    public int HoursToUpdate
    {
        get => GetInt32("HoursToUpdate");
        set => SetValue("HoursToUpdate", value);
    }
    /// <summary>
    /// Gets or sets a value indicating the index opened in insert mode
    /// </summary>
    public bool Resume { get; set; }
    /// <summary>
    /// Gets or sets a list of user ids, which will be updated in the index
    /// </summary>
    public IEnumerable<int> UserIds { get; set; } = [];
    /// <summary>
    /// Gets the supported actions
    /// </summary>
    public override IEnumerable<string> SupportedActions => new[] { "Full", "Update", "UpdateWithIds" };
    /// <summary>
 /// Gets default settings collection
 /// </summary>
    public override IDictionary<string, object> DefaultSettings => new Dictionary<string, object> { { "HoursToUpdate", 24 }, { "DoNotFailOnMismatchingCount", true } };
    /// <summary>
    /// Build the index
    /// </summary>
    /// <param name="writer">An <see cref="IIndexWriter"></see> instance</param>
    /// <param name="tracker">A <see cref="Tracker"/> instance</param>
    public override void Build(IIndexWriter writer, Tracker tracker)
    {
        ArgumentNullException.ThrowIfNull(writer, nameof(writer));
        ArgumentNullException.ThrowIfNull(tracker, nameof(tracker));
        tracker.LogInformation("{0} building using {1}... Action: '{2}', Resume: '{3}'  (Threadid: {4})", GetType().FullName ?? string.Empty, writer.GetType().FullName ?? string.Empty, Action, Resume, System.Threading.Thread.CurrentThread.ManagedThreadId);
        if (string.IsNullOrEmpty(Action))
        {
            Action = "Full";
        }
        try
        {
            tracker.LogInformation("Opening index writer.");
            if (Resume || Action.Equals("Update") || Action.Equals("UpdateWithIds"))
            {
                writer.Open(true);
                tracker.LogInformation("Opened index writer for update");
            }
            else
            {
                writer.Open(false);
                tracker.LogInformation("Opened index writer to overwrite index");
            }
....
}
Then in our process method we do this:
 
Private void ProcessUsers(IDbConnection connection, IIndexWriter writer, Tracker tracker)
        {
            tracker.LogInformation($"Starting processing users. (Threadid: {System.Threading.Thread.CurrentThread.ManagedThreadId})");
            using (IDbCommand command = connection.CreateCommand())
            {
                command.CommandText = "SELECT * FROM AccessUser with (NOLOCK) WHERE AccessUserType in (1, 3, 5)";
                if (Action.Equals("UpdateWithIds"))
                {
                    command.CommandText += $" AND AccessUserID IN ({string.Join(",", UserIds)})";
                }
                else if (Action.Equals("Update"))
                {
                    command.CommandText += $" AND AccessUserUpdatedOn > {Database.SqlDate(DateTime.Now.AddHours(HoursToUpdate * -1))}";
                }
                command.CommandText += $" ORDER BY AccessUserID";
...
}