func (self *Coordinator) runSingleQuery(user common.User, db string, q *parser.Query, p engine.Processor) error { querySpec := parser.NewQuerySpec(user, db, q) if ok, err := self.permissions.CheckQueryPermissions(user, db, querySpec); !ok { return err } switch qt := q.Type(); qt { // administrative case parser.DropContinuousQuery: return self.runDropContinuousQuery(user, db, uint32(q.DropQuery.Id)) case parser.ListContinuousQueries: return self.runListContinuousQueries(user, db, p) case parser.Continuous: return self.runContinuousQuery(user, db, q.GetQueryString()) case parser.ListSeries: return self.runListSeriesQuery(querySpec, p) case parser.ListQueries: return self.runListQueries(user, db, p) // Data queries case parser.Delete: return self.runDeleteQuery(querySpec, p) case parser.DropSeries: return self.runDropSeriesQuery(querySpec) case parser.Select: return self.runQuerySpec(querySpec, p) default: return fmt.Errorf("Can't handle query %s", qt) } }
func (self *CoordinatorSuite) TestShouldQuerySequentially(c *C) { end := time.Now().Truncate(24 * time.Hour) start := end.Add(-7 * 24 * time.Hour) shard := cluster.NewShard(1, start, end, "", "", nil) shards := []*cluster.ShardData{shard} coordinator := NewCoordinator(&configuration.Configuration{ ClusterMaxResponseBufferSize: 1000, }, nil, nil) queries := map[string]bool{ "list series": false, "select count(foo) from /.*bar.*/ group by time(1d)": true, "select count(foo) from bar": true, "select foo from bar": true, "select count(foo) from bar group by baz": true, "select count(foo) from bar group by time(1d)": false, "select count(foo) from bar group by time(3d)": true, } for query, result := range queries { fmt.Printf("Testing %s\n", query) parsedQuery, err := parser.ParseQuery(query) c.Assert(err, IsNil) c.Assert(parsedQuery, HasLen, 1) querySpec := parser.NewQuerySpec(nil, "", parsedQuery[0]) c.Assert(coordinator.shouldQuerySequentially(shards, querySpec), Equals, result) } }
func (self *ProtobufRequestHandler) handleQuery(request *protocol.Request, conn net.Conn) { // the query should always parse correctly since it was parsed at the originating server. queries, err := parser.ParseQuery(*request.Query) if err != nil || len(queries) < 1 { log.Error("Error parsing query: ", err) errorMsg := fmt.Sprintf("Cannot find user %s", *request.UserName) response := &protocol.Response{ Type: protocol.Response_ERROR.Enum(), ErrorMessage: &errorMsg, RequestId: request.Id, } self.WriteResponse(conn, response) return } query := queries[0] var user common.User if *request.IsDbUser { user = self.clusterConfig.GetDbUser(*request.Database, *request.UserName) } else { user = self.clusterConfig.GetClusterAdmin(*request.UserName) } if user == nil { errorMsg := fmt.Sprintf("Cannot find user %s", *request.UserName) response := &protocol.Response{ Type: protocol.Response_ERROR.Enum(), ErrorMessage: &errorMsg, RequestId: request.Id, } self.WriteResponse(conn, response) return } shard := self.clusterConfig.GetLocalShardById(*request.ShardId) querySpec := parser.NewQuerySpec(user, *request.Database, query) responseChan := make(chan *protocol.Response) if querySpec.IsDestructiveQuery() { go shard.HandleDestructiveQuery(querySpec, request, responseChan, true) } else { go shard.Query(querySpec, responseChan) } for { response := <-responseChan response.RequestId = request.Id self.WriteResponse(conn, response) switch rt := response.GetType(); rt { case protocol.Response_END_STREAM, protocol.Response_ERROR: return case protocol.Response_QUERY: continue default: panic(fmt.Errorf("Unexpected response type: %s", rt)) } } }