in dao/feature_view_igraph_dao.go [57:109]
func (d *FeatureViewIGraphDao) GetFeatures(keys []interface{}, selectFields []string) ([]map[string]interface{}, error) {
var pkeys []string
for _, key := range keys {
if pkey := utils.ToString(key, ""); pkey != "" {
pkeys = append(pkeys, url.QueryEscape(pkey))
}
}
selector := make([]string, 0, len(selectFields))
for _, field := range selectFields {
selector = append(selector, fmt.Sprintf("\"%s\"", d.reverseFieldMap[field]))
}
var queryString string
if len(d.fieldMap) == len(selectFields) {
queryString = fmt.Sprintf("g(\"%s\").V(\"%s\").hasLabel(\"%s\")", d.group, strings.Join(pkeys, ";"), d.label)
} else {
queryString = fmt.Sprintf("g(\"%s\").V(\"%s\").hasLabel(\"%s\").fields(%s)", d.group, strings.Join(pkeys, ";"), d.label, strings.Join(selector, ","))
}
request := aligraph.ReadRequest{
QueryString: queryString,
}
resp, err := d.igraphClient.Read(&request)
if err != nil {
return nil, err
}
result := make([]map[string]interface{}, 0, len(keys))
for _, resultData := range resp.Result {
for _, data := range resultData.Data {
properties := make(map[string]interface{}, len(data))
for field, value := range data {
if field == "label" {
continue
}
switch d.fieldTypeMap[field] {
case constants.FS_DOUBLE, constants.FS_FLOAT:
properties[d.fieldMap[field]] = utils.ToFloat(value, -1024)
case constants.FS_INT32, constants.FS_INT64:
properties[d.fieldMap[field]] = utils.ToInt(value, -1024)
default:
properties[d.fieldMap[field]] = value
}
}
result = append(result, properties)
}
}
return result, nil
}