func CheckValue(v toolkit.M, f *Filter) (bool, interface{}) { resbool := false filedtemp := []interface{}{} resbool = v.Has(f.Field) if resbool { return resbool, v.Get(f.Field) } else if strings.Contains(f.Field, ".") { ar := strings.Split(f.Field, ".") for i, dt := range ar { if i == 0 { resbool = v.Has(dt) if !resbool { break } else { filedtemp = append(filedtemp, v.Get(dt)) } } else { temp := toolkit.M(filedtemp[i-1].(map[string]interface{})) resbool = temp.Has(dt) if !resbool { break } else { filedtemp = append(filedtemp, temp.Get(dt)) } } if i == len(ar)-1 { return true, filedtemp[i] } } } return false, nil }
func (c *Cursor) Fetch(m interface{}, n int, closeWhenDone bool) ( *dbox.DataSet, error) { if closeWhenDone { c.Close() } e := c.prepIter() if e != nil { return nil, errorlib.Error(packageName, modCursor, "Fetch", e.Error()) } if c.jsonSelect == nil { return nil, errorlib.Error(packageName, modCursor, "Fetch", "Iter object is not yet initialized") } datas := []interface{}{} dec := json.NewDecoder(strings.NewReader(string(c.readFile))) dec.Decode(&datas) ds := dbox.NewDataSet(m) if n == 0 { whereFieldsToMap, _ := toolkit.ToM(c.whereFields) b := c.getCondition(whereFieldsToMap) var foundSelected = toolkit.M{} var foundData = []toolkit.M{} var getRemField = toolkit.M{} if c.isWhere { if b { for _, v := range datas { for i, subData := range v.(map[string]interface{}) { getRemField[i] = i //append(getRemField, i) for _, vWhere := range whereFieldsToMap { for _, subWhere := range vWhere.([]interface{}) { for _, subsubWhere := range subWhere.(map[string]interface{}) { if len(c.jsonSelect.([]string)) == 0 { if strings.ToLower(subData.(string)) == strings.ToLower(subsubWhere.(string)) { ds.Data = append(ds.Data, v) } } else { if strings.ToLower(subData.(string)) == strings.ToLower(subsubWhere.(string)) { foundData = append(foundData, v.(map[string]interface{})) } } } } } } } itemToRemove := removeDuplicatesUnordered(getRemField, c.jsonSelect.([]string)) if len(foundData) > 0 { var found toolkit.M for _, found = range foundData { for _, remitem := range itemToRemove { found.Unset(remitem) } ds.Data = append(ds.Data, found) } } } else { for _, v := range datas { for _, v2 := range v.(map[string]interface{}) { for _, vWhere := range c.whereFields.(toolkit.M) { if reflect.ValueOf(v2).Kind() == reflect.String { if strings.ToLower(v2.(string)) == strings.ToLower(vWhere.(string)) { if len(c.jsonSelect.([]string)) == 0 { ds.Data = append(ds.Data, v) } else { // fmt.Println(c.jsonSelect.([]string)[0]) // fmt.Println(v.(map[string]interface{})) foundData = append(foundData, v.(map[string]interface{})) } } } } } } if len(foundData) > 0 { for _, found := range foundData { for i, subData := range found { for _, selected := range c.jsonSelect.([]string) { if strings.ToLower(selected) == strings.ToLower(i) { foundSelected[i] = subData } else if selected == "*" { foundSelected[i] = subData } } } } ds.Data = append(ds.Data, foundSelected) } } } else { if c.jsonSelect.([]string)[0] != "*" { for _, v := range datas { for i, _ := range v.(map[string]interface{}) { getRemField[i] = i } } itemToRemove := removeDuplicatesUnordered(getRemField, c.jsonSelect.([]string)) for _, found := range datas { toMap := toolkit.M(found.(map[string]interface{})) for _, remitem := range itemToRemove { toMap.Unset(remitem) } ds.Data = append(ds.Data, found) } } else { ds.Data = datas } } } else if n > 0 { fetched := 0 fetching := true ///read line fetchFile, e := os.OpenFile(c.tempPathFile, os.O_RDWR, 0) defer fetchFile.Close() if e != nil { return nil, errorlib.Error(packageName, modQuery+".Exec", "Fetch file", e.Error()) } c.fetchSession = fetchFile scanner := bufio.NewScanner(fetchFile) lines := 0 for scanner.Scan() { lines++ } if lines > 0 { fetched = lines n = n + lines } for fetching { var dataM = toolkit.M{} if c.jsonSelect.([]string)[0] != "*" { for i := 0; i < len(c.jsonSelect.([]string)); i++ { dataM[c.jsonSelect.([]string)[i]] = datas[fetched].(map[string]interface{})[c.jsonSelect.([]string)[i]] if len(dataM) == len(c.jsonSelect.([]string)) { ds.Data = append(ds.Data, dataM) } } } else { ds.Data = append(ds.Data, datas[fetched]) } io.WriteString(fetchFile, toolkit.JsonString(dataM)+"\n") fetched++ if fetched == n { fetching = false } } } // c.Close() return ds, nil }
func (c *Cursor) Fetch(m interface{}, n int, closeWhenDone bool) error { if closeWhenDone { c.Close() } e := c.prepIter() if e != nil { return errorlib.Error(packageName, modCursor, "Fetch", e.Error()) } /*if c.jsonSelect == nil { return errorlib.Error(packageName, modCursor, "Fetch", "Iter object is not yet initialized") }*/ // var mData []interface{} datas := []toolkit.M{} dataJson := []toolkit.M{} dec := json.NewDecoder(strings.NewReader(string(c.readFile))) dec.Decode(&datas) if n == 0 { whereFieldsToMap, e := toolkit.ToM(c.whereFields) if e != nil { return errorlib.Error(packageName, modCursor, "Fetch", e.Error()) } b := c.getCondition(whereFieldsToMap) var foundSelected = toolkit.M{} var foundData = []toolkit.M{} var getRemField = toolkit.M{} if c.isWhere { if b { for _, v := range datas { for i, subData := range v { getRemField[i] = i //append(getRemField, i) for _, vWhere := range whereFieldsToMap { for _, subWhere := range vWhere.([]interface{}) { for _, subsubWhere := range subWhere.(map[string]interface{}) { if len(c.jsonSelect) == 0 { if strings.ToLower(subData.(string)) == strings.ToLower(subsubWhere.(string)) { dataJson = append(dataJson, v) } } else { if strings.ToLower(subData.(string)) == strings.ToLower(subsubWhere.(string)) { foundData = append(foundData, v) } } } } } } } itemToRemove := removeDuplicatesUnordered(getRemField, c.jsonSelect) if len(foundData) > 0 { var found toolkit.M for _, found = range foundData { for _, remitem := range itemToRemove { found.Unset(remitem) } dataJson = append(dataJson, found) } } } else { for _, v := range datas { for _, v2 := range v { for _, vWhere := range c.whereFields.(toolkit.M) { if reflect.ValueOf(v2).Kind() == reflect.String { if strings.ToLower(v2.(string)) == strings.ToLower(vWhere.(string)) { if len(c.jsonSelect) == 0 { dataJson = append(dataJson, v) } else { foundData = append(foundData, v) } } } } } } if len(foundData) > 0 { for _, found := range foundData { for i, subData := range found { for _, selected := range c.jsonSelect { if strings.ToLower(selected) == strings.ToLower(i) { foundSelected[i] = subData } else if selected == "*" { foundSelected[i] = subData } } } } dataJson = append(dataJson, foundSelected) } } // toolkit.Unjson(toolkit.Jsonify(dataJson), m) toolkit.Serde(dataJson, m, "json") } else { if c.jsonSelect == nil { toolkit.Unjson(toolkit.Jsonify(datas), m) } else { isSelectedFields := false for _, selectField := range c.jsonSelect { if selectField == "*" { // toolkit.Unjson(toolkit.Jsonify(datas), m) toolkit.Serde(datas, m, "json") } else { isSelectedFields = true } } if isSelectedFields { for _, v := range datas { for i, _ := range v { getRemField[i] = i } } itemToRemove := removeDuplicatesUnordered(getRemField, c.jsonSelect) for _, found := range datas { toMap := toolkit.M(found) for _, remitem := range itemToRemove { toMap.Unset(remitem) } dataJson = append(dataJson, toMap) } // toolkit.Unjson(toolkit.Jsonify(dataJson), m) toolkit.Serde(dataJson, m, "json") } } } } else if n > 0 { fetched := 0 fetching := true c.Connection().(*Connection).FetchSession() c.tempPathFile = c.Connection().(*Connection).tempPathFile ///read line fetchFile, e := os.OpenFile(c.Connection().(*Connection).tempPathFile, os.O_RDWR, 0) defer fetchFile.Close() if e != nil { return errorlib.Error(packageName, modQuery+".Exec", "Fetch file", e.Error()) } c.fetchSession = fetchFile scanner := bufio.NewScanner(fetchFile) lines := 0 for scanner.Scan() { lines++ } if lines > 0 { fetched = lines n = n + lines } for fetching { var dataM = toolkit.M{} if c.jsonSelect == nil { dataJson = append(dataJson, datas[fetched]) } else { for _, selectField := range c.jsonSelect { if selectField == "*" { dataJson = append(dataJson, datas[fetched]) } else { dataM.Set(selectField, datas[fetched][selectField]) if len(dataM) == len(c.jsonSelect) { dataJson = append(dataJson, dataM) } } } } // toolkit.Unjson(toolkit.Jsonify(dataJson), m) toolkit.Serde(dataJson, m, "json") io.WriteString(fetchFile, toolkit.JsonString(dataM)+"\n") fetched++ if fetched == n { fetching = false } } } fmt.Sprintln("") return nil }