go-driver icon indicating copy to clipboard operation
go-driver copied to clipboard

Initiate pregel call

Open Thebigwind opened this issue 5 years ago • 2 comments

How to initiate a pregel call via /_db/_system/_api/control_pregel? I call like this, but it does not return result: func (db *dbService) QueryPregel2(reqParams interface{}) (error, interface{}) { conn := db.client.Connection() req, err := conn.NewRequest("POST", path.Join("_db", db.db.Name(), "/_api/control_pregel")) if err != nil { DBLogger.Errorf(err.Error()) return err, nil }

if _, err := req.SetBody(reqParams); err != nil {
	DBLogger.Errorf(err.Error())
	return err, nil
}

ctx := context.Background()
resp, err := conn.Do(ctx, req)
if err != nil {
	DBLogger.Errorf(err.Error())
	return err, nil
}
if err := resp.CheckStatus(200); err != nil {
	DBLogger.Errorf(err.Error())
	return err, nil
}
var result interface{}
if err := resp.ParseBody("", &result); err != nil {
	DBLogger.Errorf("parse body error:%v", err.Error())
	return err, nil
}

return nil, result

} `

Thebigwind avatar Jun 02 '20 03:06 Thebigwind

It would probably help to know what reqParams you're passing.

irridia avatar Oct 01 '20 05:10 irridia

@irridia I believe I'm running into the same issue as the original poster here. My code below produces this error

ERROR:
  Code: Unknown
  Message: json: cannot unmarshal string into Go value of type map[string]*json.RawMessage

Code:

func (s Server) GetConnectedComponents(ctx context.Context, request *graphv1.GetConnectedComponentsRequest) (*graphv1.GetConnectedComponentsResponse, error) {
	log.Debugf("GetConnectedComponents called with: %s", request)

	// build request
	pregelParams := map[string]interface{}{
		"algorithm": "connectedcomponents",
		"graphName": request.GetApplication().String(),
		"params": map[string]interface{}{
			"resultField": "component",
		},
	}

	conn := s.arango.client.Connection()
	req, err := conn.NewRequest("POST", path.Join("_db", s.arango.db.Name(), "/_api/control_pregel"))
	if err != nil {
		log.Errorf("error creating control_pregel request")
		return nil, err
	}

	if _, err := req.SetBody(pregelParams); err != nil {
		log.Errorf("error setting control_pregel request params")
		return nil, err
	}

	// make request
	resp, err := conn.Do(ctx, req)
	if err != nil {
		log.Errorf("error executing control_pregel request")
		return nil, err
	}
	if err := resp.CheckStatus(200); err != nil {
		log.Errorf("error checking control_pregel response status")
		return nil, err
	}
	var result string
	if err := resp.ParseBody("id", &result); err != nil {
		log.Errorf("error parsing control_pregel response: %v", resp)
		return nil, err
	}
	log.Debugf("result: %s", result)

	// TODO: wait for pregel to complete and query for nodes in CCs?

	// map response
	log.Debug("GetConnectedComponents request finished")
	response := &graphv1.GetConnectedComponentsResponse{
		ConnectedComponents: nil,
	}
	return response, nil
}

I assume I'm just not parsing the response correctly. I see the documentation suggests the response will contain the string id of the pregel job initiated by the request, but I've been unable to parse the response body with any combination of result type or ParseBody field parameter value.

briardoty avatar May 06 '22 00:05 briardoty

Pregel API has been added to the driver https://github.com/arangodb/go-driver/commit/95925b1e1ece53d6d5a6a04a603d9f357134cd1e

Please use it instead of raw request.

jwierzbo avatar Sep 27 '22 11:09 jwierzbo