From 8656aa637c6a5f1d2a22f89e27dffc5ab7aa6e17 Mon Sep 17 00:00:00 2001 From: shaoying Date: Tue, 27 Jul 2021 22:52:56 +0800 Subject: [PATCH] opt mall --- base/mdb/hash.go | 141 +++++++++++++++++++++++++++++++++++++++++++++++ base/mdb/list.go | 131 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 272 insertions(+) create mode 100644 base/mdb/hash.go create mode 100644 base/mdb/list.go diff --git a/base/mdb/hash.go b/base/mdb/hash.go new file mode 100644 index 00000000..9ff76359 --- /dev/null +++ b/base/mdb/hash.go @@ -0,0 +1,141 @@ +package mdb + +import ( + "encoding/json" + "os" + "path" + "strings" + + ice "github.com/shylinux/icebergs" + kit "github.com/shylinux/toolkits" +) + +func _hash_fields(m *ice.Message) []string { + return kit.Split(kit.Select("time,hash,type,name,text", strings.Join(kit.Simple(m.Optionv(FIELDS)), ","))) +} +func _hash_insert(m *ice.Message, prefix, chain string, arg ...string) { + if m.Option(ice.MSG_DOMAIN) != "" { + m.Conf(prefix, kit.Keys(chain, kit.MDB_META, kit.MDB_SHORT), m.Conf(prefix, kit.Keys(kit.MDB_META, kit.MDB_SHORT))) + } + m.Log_INSERT(kit.MDB_KEY, path.Join(prefix, chain), arg[0], arg[1]) + h := m.Rich(prefix, chain, kit.Data(arg)) + m.Echo(h) +} +func _hash_delete(m *ice.Message, prefix, chain, field, value string) { + m.Richs(prefix, chain, value, func(key string, val map[string]interface{}) { + m.Log_DELETE(kit.MDB_KEY, path.Join(prefix, chain), field, value, kit.MDB_VALUE, kit.Format(val)) + m.Conf(prefix, kit.Keys(chain, kit.MDB_HASH, key), "") + }) +} +func _hash_select(m *ice.Message, prefix, chain, field, value string) { + if field == kit.MDB_HASH && value == RANDOM { + value = kit.MDB_RANDOMS + } + fields := _hash_fields(m) + cb := m.Optionv(kit.Keycb(SELECT)) + m.Richs(prefix, chain, value, func(key string, val map[string]interface{}) { + val = kit.GetMeta(val) + switch cb := cb.(type) { + case func(fields []string, value map[string]interface{}): + cb(fields, val) + default: + if m.Option(FIELDS) == DETAIL { + m.Push(DETAIL, val) + } else { + m.Push(key, val, fields) + } + } + }) + if m.Option(FIELDS) != DETAIL { + m.SortTimeR(kit.MDB_TIME) + } +} +func _hash_modify(m *ice.Message, prefix, chain string, field, value string, arg ...string) { + m.Richs(prefix, chain, value, func(key string, val map[string]interface{}) { + val = kit.GetMeta(val) + for i := 0; i < len(arg); i += 2 { + if arg[i] == field { + continue + } + kit.Value(val, arg[i], kit.Select("", arg, i+1)) + } + m.Log_MODIFY(kit.MDB_KEY, path.Join(prefix, chain), field, value, arg) + }) +} +func _hash_export(m *ice.Message, prefix, chain, file string) { + f, p, e := kit.Create(kit.Keys(file, JSON)) + m.Assert(e) + defer f.Close() + + en := json.NewEncoder(f) + en.SetIndent("", " ") + e = en.Encode(m.Confv(prefix, kit.Keys(chain, HASH))) + + m.Log_EXPORT(kit.MDB_KEY, path.Join(prefix, chain), kit.MDB_FILE, p) + m.Echo(p) +} +func _hash_import(m *ice.Message, prefix, chain, file string) { + f, e := os.Open(kit.Keys(file, JSON)) + m.Assert(e) + defer f.Close() + + list := map[string]interface{}{} + de := json.NewDecoder(f) + de.Decode(&list) + + count := 0 + if m.Conf(prefix, kit.Keys(chain, kit.MDB_META, kit.MDB_SHORT)) == "" { + for k, data := range list { + m.Conf(prefix, kit.Keys(chain, kit.MDB_HASH, k), data) + count++ + } + } else { + for _, data := range list { + m.Rich(prefix, chain, data) + count++ + } + } + + m.Log_IMPORT(kit.MDB_KEY, path.Join(prefix, chain), kit.MDB_COUNT, count) + m.Echo("%d", count) +} +func _hash_prunes(m *ice.Message, prefix, chain string, arg ...string) { + fields := _hash_fields(m) + m.Richs(prefix, chain, kit.MDB_FOREACH, func(key string, val map[string]interface{}) { + if val[kit.MDB_META] != nil { + val = val[kit.MDB_META].(map[string]interface{}) + } + switch cb := m.Optionv(kit.Keycb(PRUNES)).(type) { + case func(string, map[string]interface{}) bool: + if !cb(key, val) { + return + } + default: + for i := 0; i < len(arg)-1; i += 2 { + if val[arg[i]] != arg[i+1] { + return + } + } + } + m.Push(key, val, fields) + }) + m.Table(func(index int, value map[string]string, head []string) { + _hash_delete(m, prefix, chain, kit.MDB_HASH, value[kit.MDB_HASH]) + }) +} +func _hash_inputs(m *ice.Message, prefix, chain string, field, value string) { + list := map[string]int{} + m.Richs(prefix, chain, kit.MDB_FOREACH, func(key string, val map[string]interface{}) { + val = kit.GetMeta(val) + if field == kit.MDB_HASH { + list[key]++ + } else { + list[kit.Format(val[field])]++ + } + }) + for k, i := range list { + m.Push(field, k) + m.Push(kit.MDB_COUNT, i) + } + m.Sort(kit.MDB_COUNT, "int_r") +} diff --git a/base/mdb/list.go b/base/mdb/list.go new file mode 100644 index 00000000..9e5b0fa9 --- /dev/null +++ b/base/mdb/list.go @@ -0,0 +1,131 @@ +package mdb + +import ( + "encoding/csv" + "os" + "path" + "sort" + "strings" + + ice "github.com/shylinux/icebergs" + kit "github.com/shylinux/toolkits" +) + +func _list_fields(m *ice.Message) []string { + return kit.Split(kit.Select("time,id,type,name,text", strings.Join(kit.Simple(m.Optionv(FIELDS)), ","))) +} +func _list_insert(m *ice.Message, prefix, chain string, arg ...string) { + m.Log_INSERT(kit.MDB_KEY, path.Join(prefix, chain), arg[0], arg[1]) + m.Echo("%d", m.Grow(prefix, chain, kit.Dict(arg))) +} +func _list_delete(m *ice.Message, prefix, chain, field, value string) { +} +func _list_select(m *ice.Message, prefix, chain, field, value string) { + if value == "" { + field = "" + } + fields := _list_fields(m) + cb := m.Optionv(kit.Keycb(SELECT)) + m.Grows(prefix, chain, kit.Select(m.Option(CACHE_FIELD), field), kit.Select(m.Option(CACHE_VALUE), value), func(index int, val map[string]interface{}) { + val = kit.GetMeta(val) + switch cb := cb.(type) { + case func(fields []string, value map[string]interface{}): + cb(fields, val) + default: + if m.Option(FIELDS) == DETAIL { + m.Push(DETAIL, val) + } else { + m.Push("", val, fields) + } + } + }) +} +func _list_modify(m *ice.Message, prefix, chain string, field, value string, arg ...string) { + m.Grows(prefix, chain, field, value, func(index int, val map[string]interface{}) { + val = kit.GetMeta(val) + for i := 0; i < len(arg); i += 2 { + if arg[i] == field { + continue + } + kit.Value(val, arg[i], kit.Select("", arg, i+1)) + } + m.Log_MODIFY(kit.MDB_KEY, path.Join(prefix, chain), field, value, arg) + }) +} +func _list_export(m *ice.Message, prefix, chain, file string) { + f, p, e := kit.Create(kit.Keys(file, CSV)) + m.Assert(e) + defer f.Close() + + w := csv.NewWriter(f) + defer w.Flush() + + count := 0 + head := kit.Split(m.Option(FIELDS)) + m.Grows(prefix, chain, "", "", func(index int, val map[string]interface{}) { + if val = kit.GetMeta(val); index == 0 { + if len(head) == 0 { // 默认表头 + for k := range val { + head = append(head, k) + } + sort.Strings(head) + } + w.Write(head) // 输出表头 + } + + data := []string{} + for _, k := range head { + data = append(data, kit.Format(val[k])) + } + w.Write(data) // 输出数据 + count++ + }) + + m.Log_EXPORT(kit.MDB_KEY, path.Join(prefix, chain), kit.MDB_FILE, p, kit.MDB_COUNT, count) + m.Echo(p) +} +func _list_import(m *ice.Message, prefix, chain, file string) { + f, e := os.Open(kit.Keys(file, CSV)) + m.Assert(e) + defer f.Close() + + r := csv.NewReader(f) + + count := 0 + head, _ := r.Read() + for { + line, e := r.Read() + if e != nil { + break + } + + data := kit.Dict() + for i, k := range head { + if k == kit.MDB_EXTRA { + kit.Value(data, k, kit.UnMarshal(line[i])) + } else { + kit.Value(data, k, line[i]) + } + } + + m.Grow(prefix, chain, data) + count++ + } + + m.Log_IMPORT(kit.MDB_KEY, kit.Keys(prefix, chain), kit.MDB_COUNT, count) + m.Echo("%d", count) +} +func _list_prunes(m *ice.Message, prefix, chain string, arg ...string) { +} +func _list_inputs(m *ice.Message, prefix, chain string, field, value string) { + list := map[string]int{} + m.Grows(prefix, chain, "", "", func(index int, val map[string]interface{}) { + val = kit.GetMeta(val) + list[kit.Format(val[field])]++ + }) + for k, i := range list { + m.Push(field, k) + m.Push(kit.MDB_COUNT, i) + } + m.SortIntR(kit.MDB_COUNT) +}