in bydbctl/internal/cmd/analyze.go [35:118]
func newAnalyzeCmd() *cobra.Command {
analyzeCmd := &cobra.Command{
Use: "analyze",
Version: version.Build(),
Short: "Analyze operation",
}
var subjectName string
seriesCmd := &cobra.Command{
Use: "series",
Version: version.Build(),
Short: "Analyze series cardinality and distribution",
RunE: func(_ *cobra.Command, args []string) (err error) {
if len(args) == 0 {
return errors.New("series index directory is required, its name should be 'sidx' in a segment 'seg-xxxxxx'")
}
store, err := inverted.NewStore(inverted.StoreOpts{
Path: args[0],
Logger: logger.GetLogger("series-analyzer"),
})
if err != nil {
return err
}
ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
defer cancel()
iter, err := store.SeriesIterator(ctx)
if err != nil {
return err
}
defer func() {
err = multierr.Append(err, iter.Close())
}()
if subjectName != "" {
var found bool
for iter.Next() {
var s pbv1.Series
if err = s.Unmarshal(iter.Val().EntityValues); err != nil {
return err
}
if s.Subject == subjectName {
found = true
for i := range s.EntityValues {
fmt.Printf("%s,", pbv1.MustTagValueToStr(s.EntityValues[i]))
}
fmt.Println()
continue
}
if found {
break
}
}
return
}
var subject string
var count, total int
for iter.Next() {
total++
var s pbv1.Series
if err = s.Unmarshal(iter.Val().EntityValues); err != nil {
return err
}
if s.Subject != subject {
if subject != "" {
fmt.Printf("%s, %d\n", subject, count)
}
subject = s.Subject
count = 1
} else {
count++
}
}
if subject != "" {
fmt.Printf("%s, %d\n", subject, count)
}
fmt.Printf("total, %d\n", total)
return nil
},
}
seriesCmd.Flags().StringVarP(&subjectName, "subject", "s", "", "subject name")
analyzeCmd.AddCommand(seriesCmd)
return analyzeCmd
}