コンテンツにスキップ

状態と操作の流れ

扱うこと: インデックス・インデックス作成の状態の判定と表示、状態を読み直すタイミング、検索・インデックス作成・前回残った Office の終了・閉じるときの操作の流れ。扱わないこと: 各タブの詳しい仕様(インデックス一覧の管理・検索タブ)。先に読むページ: 画面。

状態の判定と表示

画面がインデックスとインデックス作成の状態をどう判定して見せるか(状態の判定と表示)と、検索・インデックス作成・前回残った Office の終了・終了の操作の流れ(操作の流れ)をまとめる。

インデックスとインデックス作成の状態

状態 判定方法 [インデックス管理]の表示 起動時のタブ
未作成 work/store/content に本文インデックスのファイルが無い No.5 に まだインデックスがありません。 1
中断中 work/store/ingest_status.tsv に状態が 未取り込み の行がある(中止した場合の状態。利用者の PowerPoint のために取り込めなかったファイルも状態は 未取り込み だが、エラーの列に理由があるので、待ちではなく失敗に数え、この表示には入らない) No.5 の次の行に 更新を中断しました(残り N 件)(getIndexingStateText。indexing_view.ps1)、No.6 のボタンは[続きから再開(残り N 件)] 1
失敗あり work/store/ingest_status.tsv に状態が 失敗 の行がある 「更新に失敗したファイル」の一覧(⚠ 更新に失敗したファイル N 件。ファイルごとに失敗の原因を表示) 2(タブ見出しに ⚠)
インデックス作成中 この画面で始めたインデックス作成のスレッド(IndexingSession)が動いている(isIndexing。実行ボタンの表示) No.6 のボタンが 更新中…(無効)。進み具合(インデックス作成の進み具合) 1
通常 上のいずれでもない No.5 に 更新済み N ファイル(集約ファイル M 件 ・ 最終更新 M/d H:mm) のみ 2
  • 前の前の版のインデックス(index\。しるしあり)が見つかったときは、起動時・ワークスペースを切り替えたときにステータスへ知らせを出す(getLegacyIndexMessage)。[すべて更新]では、store\content\ と content_index\ がどちらも空のときだけ更新し直しの確かめを出す(更新し直しの確かめ)。
  • 「最終更新」は、インデックス配下の本文インデックスのファイルの最新の更新日時とする。
  • 「インデックス作成中」は、この画面で始めたインデックス作成のスレッドが動いているかで判定する。インデックス作成は画面のプロセスの中で動くため、画面を開いたときに動いているものは無い。画面を使わずに起動した indexer.ps1 と重なったときは、インデクサがミューテックスで二重に動かないようにする(インデックス作成のメインフロー)。

インデックス作成の状態遷移(画面から見た状態)

stateDiagram-v2
    direction LR
    state "未作成" as None
    state "通常" as Ready
    state "インデックス作成中" as Running
    state "中断中" as Suspended
    state "失敗あり" as HasError

    [*] --> None
    None --> Running : 更新を開始<br>(確認で[更新を開始])
    Ready --> Running : 更新を開始<br>(確認で[更新を開始])
    Suspended --> Running : 続きから再開
    HasError --> Running : 更新を開始<br>(確認で失敗分も再更新するかを選ぶ)
    Running --> Ready : 全件成功
    Running --> HasError : 失敗あり
    Running --> Suspended : [中止]・止めて閉じる<br>PC の停止
    Running --> Ready : 確認で[キャンセル]<br>更新不要(更新するものが無い)

状態を読み直すタイミング

  • 起動時、タブを切り替えたとき、ウィンドウがアクティブになったとき、始めたインデックス作成が終わったとき。
  • 本文インデックスのファイルの件数は、インデックスが大きいと数えるのに時間がかかるため、画面の裏の仕事のスレッド(startJob。BackgroundQueue)で数える。数え終わるまでは 確認中… と表示し、その間も画面を操作できるようにする。

操作の流れ

検索

sequenceDiagram
    autonumber
    actor U as 利用者
    participant G as 画面
    participant S as 検索の司令(SearchService)
    participant P as 照合のプール
    participant I as 検索対象インデックス

    U->>G: ワードを入力して Enter
    G->>G: 入力チェック(ワードが空でない・本文インデックスのファイル 1 件以上・検索対象にチェックあり)
    G->>S: 検索の要求を渡す(newSearchRequest。前の要求は Stop で取り消す)
    G->>G: [検索]→[中止]、結果の表をクリア
    loop 作業(約 16MB)ごと
        S->>P: 作業を渡す
        P->>I: .NET(StreamReader+[regex])で読み込み・照合
        P-->>S: ヒット
        S-->>G: 要求の列にヒットと進み具合を入れる
        G->>G: 時間で区切って列から取り出し(pumpSearch)、ファイルの見出しを表に追加、「検索中… N / M ファイル(K 件)」
    end
    S-->>G: 完了(Finished)
    S->>S: 読んだ内容のキャッシュを整理(trimTsvTextCache)
    G->>G: 「一致 N 件(M ファイル)・X 秒」、[中止]→[検索]
    U->>G: 見出しをクリックして行を開き、行をダブルクリック
    G->>G: 元のファイルの該当箇所を開く
  • 検索の司令と照合のプールは、画面を開いている間使い回す(寿命)。

インデックス作成

sequenceDiagram
    autonumber
    actor U as 利用者
    participant G as 画面
    participant C as setting.config
    participant K as 受け渡しの口(メモリ)
    participant P as インデクサの司令のスレッド(indexer.ps1 -Channel)
    participant W as work/

    U->>G: [すべて更新]など
    opt 前の前の版のしるしがあり本文インデックスの置き場が空
        G->>U: 更新し直しの確かめ(3.1。getReingestConfirm)
        U->>G: [キャンセル]なら始めない
    end
    G->>C: インデックス一覧を保存
    G->>P: スレッドで実行(IndexingSession。受け渡しの口の ConfirmTargets)
    G->>G: 実行ボタンを無効化、「更新中…」、[中止]を表示
    P->>K: 更新の対象を数えて更新の予定(Plan)を入れ、返事を待つ
    G->>K: 更新の予定を読む
    G->>U: インデックス作成の確認(インデックスごとの件数。3.4)
    alt [更新を開始]
        U->>G: (前回失敗分も再更新するかを選ぶ)
        G->>K: 更新する返事(answerIndexingPlan)
    else [キャンセル]
        U->>G: 取りやめ
        G->>K: 取りやめの返事(answerIndexingPlan $null)
        P-->>G: 1 件も更新せずに終了(終了コード 2)
    end
    loop 1 秒ごと(スレッドが終わるまで)
        P->>W: 取り込みのスレッドで TSV を作成し、フォルダごとに本文インデックスに入れ、取り込み一覧を更新
        P->>K: 進み具合(Progress)を入れる
        G->>K: 進み具合を読む
        G->>G: 進み具合を表示
    end
    opt [中止]
        U->>G: [中止]→[中止する]
        G->>K: 中止(requestIndexingStop)
        P->>W: 読み取り中のファイルが終わったら止まる
    end
    P-->>G: スレッドの終了(受け渡しの口の ExitCode 0 / 1 / 2・Error)
    G->>G: 終了コードに応じた表示、[検索する]
    G->>W: 状態を読み直す

前回残った Office の終了

sequenceDiagram
    autonumber
    actor U as 利用者
    participant G as 画面
    participant O as Office プロセス

    G->>O: 起動時に記録のある残り物を取得(getOfficeProcesses)
    G->>U: 確認(件数・一覧)
    U->>G: [終了する]
    G->>O: 確認の時点の PID を読み直して選ぶ
    G->>O: 止める直前に照らし直して Stop-Process -Force
    G->>G: 「Office を N 件終了しました。」

詳しくは 前回残った Office の確認 を参照。

閉じる

  • 閉じるのはタイトルバーの[×](または Alt+F4)で行う。画面に[閉じる]ボタンは置かない。
  • 設定はその場で保存しているため、保存の確認は無い。
  • 検索中なら検索を取り消してから閉じる。
  • インデックス作成は画面のプロセスの中で動くため、画面を閉じるときは止める。インデックス作成を続けたまま画面だけを閉じることはできない。

インデックス作成中に閉じようとすると、確認ダイアログ(確認ダイアログ)を出す。

項目 内容
見出し インデックスを更新中です。中止して閉じますか?
結果の行 → いま更新しているファイルが終わったところで止まり、画面を閉じます、✓ ここまで更新した分はそのまま残ります(詳細: 次に開いて[すべて更新]を押すと、続きから再開します)
選択肢 [中止して閉じる]/[閉じない]
sequenceDiagram
    autonumber
    actor U as 利用者
    participant G as 画面
    participant P as インデクサ(IndexingSession)
    participant S as 検索・画面の裏の仕事

    U->>G: [×]
    alt インデックス作成中
        G->>U: 止めてから閉じるか確認([閉じない]なら閉じずに終わる)
        U->>G: [中止して閉じる]
        G->>G: 閉じるのを保留。進み具合欄に「更新を止めています…」<br>待つ間のダイアログ(秒読みつき)を出す
        G->>P: 中止(Stop)
        loop 0.5 秒ごと(closeTimer)
            G->>P: 終わったか(IsRunning)
        end
        opt 60 秒たっても終わらない
            G->>P: インデックス作成が起動した Office だけを止める(KillOffice)
        end
        opt さらに 15 秒たっても終わらない
            G->>G: 待つのをやめる
        end
        P-->>G: 終了
    end
    G->>S: 検索を取り消す
    G->>G: closeTimer・インデックス作成のタイマーを止める
    G->>P: スレッドを片づける(IndexingSession.Close)
    G->>S: 検索の司令・照合のプールを閉じる(SearchService.Close)
    G->>S: jobTimer を止め、画面の裏の仕事のスレッドを閉じる(BackgroundQueue.Close)
    G->>G: 多重起動のミューテックスを解放
    G->>U: 閉じる
  • 確認している間にインデックス作成が終わっていれば、[中止して閉じる]でそのまま閉じる。
  • 止めるのを待っている間にもう一度[×]を押しても、何もしない。
  • 60 秒待っても終わらないのは、Office が応答しないときである。止めるのは、インデックス作成が起動して PID を記録した Office だけで、利用者が開いていた Office は止めない(閉じるときの順番)。