82 lines
2.2 KiB
Go
82 lines
2.2 KiB
Go
package main
|
|
|
|
import (
|
|
"flag"
|
|
"log/slog"
|
|
|
|
"git.algo.com.cn/public/bloomtool/internal/bloom"
|
|
)
|
|
|
|
func RunAnd(args ...string) error {
|
|
fs := flag.NewFlagSet("and", 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 andOperation(*bmpFile1, *bmpFile2, *outFile)
|
|
}
|
|
|
|
func andOperation(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
|
|
}
|
|
|
|
// 执行AND运算
|
|
slog.Info("perform AND operation")
|
|
result, err := bf1.And(bf2)
|
|
if err != nil {
|
|
slog.Error("AND 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("AND operation completed", "resultElements", resultStat.ElementsAdded)
|
|
|
|
return nil
|
|
}
|