package main import ( "flag" "log/slog" "git.algo.com.cn/public/bloomtool/internal/bloom" ) func RunOr(args ...string) error { fs := flag.NewFlagSet("or", flag.ExitOnError) bmpFile1 := fs.String("b1", "", "first bitmap filename") bmpFile2 := fs.String("b2", "", "second bitmap filename") outFile := fs.String("o", "", "output bitmap filename") if err := fs.Parse(args); err != nil { return err } else if fs.NArg() > 0 || *bmpFile1 == "" || *bmpFile2 == "" || *outFile == "" { fs.Usage() return nil } return orOperation(*bmpFile1, *bmpFile2, *outFile) } func orOperation(bmpFile1, bmpFile2, outFile string) error { // 加载第一个bitmap文件 slog.Info("load first bitmap file", "filename", bmpFile1) bf1, err := bloom.LoadFromFile(bmpFile1, false) if err != nil { slog.Error("load first bitmap file error", "err", err) return err } // 加载第二个bitmap文件 slog.Info("load second bitmap file", "filename", bmpFile2) bf2, err := bloom.LoadFromFile(bmpFile2, false) if err != nil { slog.Error("load second bitmap file error", "err", err) return err } // 检查参数一致性 stat1 := bf1.GetStat() stat2 := bf2.GetStat() slog.Info("first bitmap info", "elements", stat1.ElementsMax, "falseRate", stat1.FalsePositiveRate) slog.Info("second bitmap info", "elements", stat2.ElementsMax, "falseRate", stat2.FalsePositiveRate) if stat1.ElementsMax != stat2.ElementsMax { slog.Error("elements count mismatch", "file1", stat1.ElementsMax, "file2", stat2.ElementsMax) return flag.ErrHelp } if stat1.FalsePositiveRate != stat2.FalsePositiveRate { slog.Error("false positive rate mismatch", "file1", stat1.FalsePositiveRate, "file2", stat2.FalsePositiveRate) return flag.ErrHelp } // 执行OR运算 slog.Info("perform OR operation") result, err := bf1.Or(bf2) if err != nil { slog.Error("OR operation error", "err", err) return err } // 保存结果 slog.Info("save result bitmap file", "filename", outFile) err = result.SaveToFile(outFile) if err != nil { slog.Error("save result bitmap file error", "err", err) return err } resultStat := result.GetStat() slog.Info("OR operation completed", "resultElements", resultStat.ElementsAdded) return nil }