From 6a413e1d7d485f506e81c669bc692868c29cefb9 Mon Sep 17 00:00:00 2001
From: sunty <1172534965@qq.com>
Date: 星期四, 18 七月 2019 17:37:25 +0800
Subject: [PATCH] fix sdkcompare

---
 shardmap/shardmap.go |   76 +++++++++++++++++++++++---------------
 1 files changed, 46 insertions(+), 30 deletions(-)

diff --git a/shardmap/shardmap.go b/shardmap/shardmap.go
index 914aba3..4868281 100644
--- a/shardmap/shardmap.go
+++ b/shardmap/shardmap.go
@@ -4,20 +4,18 @@
 
 import (
 	"sync"
-    "fmt"
-
-    "basic.com/pubsub/protomsg.git"
+    //"encoding/json"
+    //"fmt"
 )
 
+var commonmux sync.Mutex
 const (
-	DEF_SHARD_CNT = 32
 
 	BKDR_SEED = 131 // 31 131 1313 13131 131313 etc...
 )
 
 type shardItem struct {
 	sync.RWMutex
-
 	data map[string]interface{}
 }
 
@@ -28,15 +26,12 @@
 
 var Count = make(chan int)
 
-type wfOp func(a, b string) float32 
+type wfOp func(a []byte, b string) float32 
 
 /**
 * @param uint8, shardCnt must be pow of two
 */
 func New(shardCnt uint8) *ShardMap {
-	if !isPowOfTwo(shardCnt) {
-		shardCnt = DEF_SHARD_CNT
-	}
 
 	s := &ShardMap{
 		shardCnt: shardCnt,
@@ -83,33 +78,58 @@
 }
 
 // modify by long.
-func (s *ShardMap) Walk(wf wfOp, cfrom string) []protomsg.Baseinfo{
+func (s *ShardMap) Walk(wf wfOp, cfrom []byte) ( map[string]float32 ){
     var wg sync.WaitGroup
     var second float32 
 
-    var baseinfos []*protomsg.Baseinfo
+    ids := make(map[string]float32)
+	for _, si := range s.shards {
+        var tempsi shardItem
+            tempsi = *si
+
+
+        wg.Add(1)
+        
+		go func(st *shardItem, fw wfOp, cf []byte) {
+            defer wg.Done()
+            commonmux.Lock()
+			for id, feature := range st.data {
+                 if str, ok := feature.(string); ok {
+                    second = fw(cf,str)
+                    if second == -1 {
+                        continue 
+                     }
+                    ids[id]=second
+                 }
+			}
+		 commonmux.Unlock()
+		}(&tempsi, wf, cfrom)
+	}
+
+    wg.Wait()
+
+    return ids
+
+}
+
+// print all
+func (s *ShardMap) Printall() (infos []interface{}){
+    var wg sync.WaitGroup
 
 	for _, si := range s.shards {
         wg.Add(1)
-		go func(s *shardItem, fw wfOp, cf string) {
+		go func(s *shardItem) {
             defer wg.Done()
 			s.RLock()
-			for key, value := range s.data {
-                 second = fw(cf,key)
-                 if second == -1 {
-                        continue 
-                 }
-                 if info, ok := value.(*protomsg.Baseinfo) ;ok {
-                    fmt.Println("姣斿鍒嗘暟: ", second)
-                    info.CompareScore = second
-                    baseinfos = append(baseinfos,info) 
-                 } 
-			}
-			s.RUnlock()
-		}(si,wf, cfrom)
+			for _, value := range s.data {
+                infos = append(infos, value)
+            } 
+    	
+ 	 	s.RUnlock()
+		}(si)
 	}
     wg.Wait()
-    return baseinfos
+    return
 }
 
 func (s * ShardMap)GetLen() int {
@@ -124,10 +144,6 @@
 	i := bkdrHash(key) & uint32(s.shardCnt-1)
 
 	return s.shards[i]
-}
-
-func isPowOfTwo(x uint8) bool {
-	return x != 0 && (x&(x-1) == 0)
 }
 
 //https://www.byvoid.com/blog/string-hash-compare/

--
Gitblit v1.8.0