From 171d94e0f254b485ed5d09cef9a208b0f5672048 Mon Sep 17 00:00:00 2001
From: sunty <1172534965@qq.com>
Date: 星期二, 08 九月 2020 14:01:26 +0800
Subject: [PATCH] fix source aggs

---
 EsClient_test.go |  111 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 110 insertions(+), 1 deletions(-)

diff --git a/EsClient_test.go b/EsClient_test.go
index 7c078bf..17e6525 100644
--- a/EsClient_test.go
+++ b/EsClient_test.go
@@ -1,9 +1,11 @@
 package esutil
 
 import(
-        "testing"  
+    "math"
+    "testing"
         "fmt"
         "encoding/json"
+    "time"
 )
 
 func TestEsReq(t  *testing.T){
@@ -28,3 +30,110 @@
     }
     fmt.Println(dbinfos)
 }
+func FaceSourceAggregations(buf []byte, thresholdTime int, thresholdStayTime int) (sources []map[string]interface{}, err error) {
+    loc, err := time.LoadLocation("Asia/Shanghai")
+    if err != nil {
+        return nil, errors.New("鏃跺尯璁剧疆閿欒")
+    }
+    var info interface{}
+    json.Unmarshal(buf, &info)
+    out, ok := info.(map[string]interface{})
+    if !ok {
+        return nil, errors.New("http response interface can not change map[string]interface{}")
+    }
+    middle, ok := out["aggregations"].(map[string]interface{})
+    if !ok {
+        return nil, errors.New("first hits change error!")
+    }
+    bucketsAggs := middle["buckets_aggs"].(map[string]interface{})
+    buckets := bucketsAggs["buckets"].([]interface{})
+    if len(buckets) == 0 {
+        return nil, nil
+    }
+    allSource := make([]map[string]interface{}, 0)
+    for _, inf := range buckets {
+        hitsSources := make([]map[string]interface{}, 0)
+        topAttentionHits := inf.(map[string]interface{})["top_attention_hits"].(map[string]interface{})
+        middleHits := topAttentionHits["hits"].(map[string]interface{})
+        finalHits := middleHits["hits"].([]interface{})
+        startTime := ""
+        indexLength := len(finalHits)
+        point := 0
+        for _, in := range finalHits {
+            point = point + 1
+            tmpHitSource := make(map[string]interface{})
+            tmpBuf, ok := in.(map[string]interface{})
+            if !ok {
+                fmt.Println("change to source error!")
+                continue
+            }
+            source, ok := tmpBuf["_source"].(map[string]interface{})
+            if !ok {
+                fmt.Println("change _source error!")
+                continue
+            }
+            baseInfo := source["baseInfo"].([]interface{})[0].(map[string]interface{})
+            targetInfo := source["targetInfo"].([]interface{})[0].(map[string]interface{})
+            tmpTime := source["picDate"].(string)
+            mTime, err := time.ParseInLocation("2006-01-02 15:04:05", tmpTime, loc)
+            if err != nil {
+                return nil, errors.New("鏃堕棿瑙f瀽閿欒")
+            }
+
+            sTime := tmpTime
+            eTime := mTime.Add(time.Second * 1).Format("2006-01-02 15:04:05")
+            stayTime := 1.0
+            if startTime != "" && point <= indexLength {
+                sinTime, _ := time.ParseInLocation("2006-01-02 15:04:05", startTime, loc)
+                passTime := math.Abs(mTime.Sub(sinTime).Seconds())
+                hitsSources[len(hitsSources)-1]["stayTime"] = stayTime
+                //fmt.Println("passTime:   ", passTime)
+                if int(passTime) <= thresholdTime {
+                    if point == indexLength {
+                        hitStartTime := hitsSources[len(hitsSources)-1]["startTime"].(string)
+                        realStartTime, _ := time.ParseInLocation("2006-01-02 15:04:05", hitStartTime, loc)
+                        stayTime = math.Abs(mTime.Sub(realStartTime).Seconds())
+                        hitsSources[len(hitsSources)-1]["stayTime"] = stayTime
+                        startTime = ""
+                    } else {
+                        startTime = tmpTime
+                        hitsSources[len(hitsSources)-1]["endTime"] = tmpTime
+                        continue
+                    }
+
+                } else {
+                    hitStartTime := hitsSources[len(hitsSources)-1]["startTime"].(string)
+                    hitEndTime := hitsSources[len(hitsSources)-1]["endTime"].(string)
+                    realStartTime, _ := time.ParseInLocation("2006-01-02 15:04:05", hitStartTime, loc)
+                    realEndTime, _ := time.ParseInLocation("2006-01-02 15:04:05", hitEndTime, loc)
+                    stayTime = math.Abs(realEndTime.Sub(realStartTime).Seconds())
+                    if sinTime.Sub(mTime).Seconds() == 0 {
+                        sinTime.Add(time.Second * 1)
+                        sinTime.Format("2006-01-02 15:04:05")
+                        hitsSources[len(hitsSources)-1]["endTime"] = tmpTime
+                        stayTime = 1
+                    }
+                    hitsSources[len(hitsSources)-1]["stayTime"] = stayTime
+                    if point == indexLength {
+                        stayTime = 1
+                    }
+                    startTime = ""
+                }
+            }
+            //fmt.Println("========================================================")
+            startTime = tmpTime
+            tmpHitSource["faceId"] = baseInfo["targetId"].(string)
+            if targetInfo["areaId"] == nil {
+                continue
+            }
+            tmpHitSource["areaId"] = targetInfo["areaId"].(string)
+            tmpHitSource["startTime"] = sTime
+            tmpHitSource["faceImg"] = targetInfo["picSmUrl"].(string)
+            tmpHitSource["endTime"] = eTime
+            tmpHitSource["stayTime"] = stayTime
+            hitsSources = append(hitsSources, tmpHitSource)
+        }
+        allSource = append(allSource, hitsSources...)
+    }
+    return allSource, nil
+}
\ No newline at end of file

--
Gitblit v1.8.0