new: implement dispatch check logic

This commit is contained in:
Wataru Otsubo 2024-10-03 11:26:36 +09:00
parent abafce1d49
commit 8d75dcd0e9
2 changed files with 74 additions and 0 deletions

View file

@ -14,6 +14,9 @@ include("create_table.jl")
include("download_csv.jl")
include("import_data.jl")
include("dispatch_checker.jl")
using .DispatchChecker
"""
create_database_from_exported_csvs(
dbpath::AbstractString;

71
src/dispatch_checker.jl Normal file
View file

@ -0,0 +1,71 @@
module DispatchChecker
using SQLite
using DBInterface
using DataFrames
export DbConnection
export is_dispatchable
mutable struct DbConnection
db::SQLite.DB
df_single_result::DataFrame
df_extra_results::DataFrame
function DbConnection(db::SQLite.DB)
df_single_results =
DBInterface.execute(db, sql"select * from qaqc_single_run_results") |> DataFrame
df_extra_results =
DBInterface.execute(db, sql"select * from qaqc_extra_run_results") |> DataFrame
new(db, df_single_results, df_extra_results)
end
end
THRESHOLD_INSUFFICIENT_RESET_WITH_10 = 0.1
THRESHOLD_RESET_FAILED_THOUGH_RECONFIG_DONE = 0.1
THRESHOLD_ALWAYS_HIT_FLAG_TRUE = 0.1
THRESHOLD_BCID_FAIL = 0.1
"""
is_dispatchable(conn::DbConnection, psbid::Int64)
Test whether the PS Board with `psbid` is dispatchable from QAQC results in `conn`.
`conn` is type of [`DbConnection`](@ref).
Since the current implemented logic is somewhat simple, it returns `missing` if it cannot be decided.
"""
function is_dispatchable(conn::DbConnection, psbid::Int64)
single_results = filter(:psboard_id => ==(psbid), conn.df_single_result)
extra_results = filter(:psboard_id => ==(psbid), conn.df_extra_results)
is_single_passed::Bool = nrow(single_results) == 1 && single_results.qaqc_result[1] == 1
@debug "" is_single_passed single_results
is_extra_passed::Bool =
nrow(extra_results) == 1 && let
extra_result = Tables.rowtable(extra_results) |> first
f1 =
extra_results.insufficient_reset_with_10 >
extra_results.num_tests * THRESHOLD_INSUFFICIENT_RESET_WITH_10
f2 =
extra_results.reset_failed_though_reconfig_done >
extra_results.num_tests * THRESHOLD_RESET_FAILED_THOUGH_RECONFIG_DONE
f3 =
extra_results.always_hit_flag_true >
extra_results.num_tests * THRESHOLD_ALWAYS_HIT_FLAG_TRUE
f4 = extra_results.bcid_fail > extra_results.num_tests * THRESHOLD_BCID_FAIL
f1 || f2 || f3 || f4
end
@debug "" is_extra_passed extra_results
if is_single_passed & is_extra_passed
return true
end
# TODO: not yet implemented
@info "results" single_results select(
extra_results,
Not(:id, :num_tests, :dac_is_0, :bcid_fail_111, :bcid_fail_000, :low_efficiency),
)
@debug "results(full)" extra_results
return missing
end
end # module DispatchChecker