func (q *Query) toProto(dst *pb.Query, appID string) error {
	if len(q.projection) != 0 && q.keysOnly {
		return errors.New("datastore: query cannot both project and be keys-only")
	}
	if len(q.distinctOn) != 0 && q.distinct {
		return errors.New("datastore: query cannot be both distinct and distinct-on")
	}
	dst.Reset()
	dst.App = proto.String(appID)
	if q.kind != "" {
		dst.Kind = proto.String(q.kind)
	}
	if q.ancestor != nil {
		dst.Ancestor = keyToProto(appID, q.ancestor)
		if q.eventual {
			dst.Strong = proto.Bool(false)
		}
	}
	if q.projection != nil {
		dst.PropertyName = q.projection
		if len(q.distinctOn) != 0 {
			dst.GroupByPropertyName = q.distinctOn
		}
		if q.distinct {
			dst.GroupByPropertyName = q.projection
		}
	}
	if q.keysOnly {
		dst.KeysOnly = proto.Bool(true)
		dst.RequirePerfectPlan = proto.Bool(true)
	}
	for _, qf := range q.filter {
		if qf.FieldName == "" {
			return errors.New("datastore: empty query filter field name")
		}
		p, errStr := valueToProto(appID, qf.FieldName, reflect.ValueOf(qf.Value), false)
		if errStr != "" {
			return errors.New("datastore: bad query filter value type: " + errStr)
		}
		xf := &pb.Query_Filter{
			Op:       operatorToProto[qf.Op],
			Property: []*pb.Property{p},
		}
		if xf.Op == nil {
			return errors.New("datastore: unknown query filter operator")
		}
		dst.Filter = append(dst.Filter, xf)
	}
	for _, qo := range q.order {
		if qo.FieldName == "" {
			return errors.New("datastore: empty query order field name")
		}
		xo := &pb.Query_Order{
			Property:  proto.String(qo.FieldName),
			Direction: sortDirectionToProto[qo.Direction],
		}
		if xo.Direction == nil {
			return errors.New("datastore: unknown query order direction")
		}
		dst.Order = append(dst.Order, xo)
	}
	if q.limit >= 0 {
		dst.Limit = proto.Int32(q.limit)
	}
	if q.offset != 0 {
		dst.Offset = proto.Int32(q.offset)
	}
	if q.count != 0 {
		dst.Count = proto.Int32(q.count)
	}
	dst.CompiledCursor = q.start
	dst.EndCompiledCursor = q.end
	dst.Compile = proto.Bool(true)
	return nil
}
func (q *Query) toProto(dst *pb.Query, appID string) error {
	if len(q.projection) != 0 && q.keysOnly {
		return errors.New("datastore: query cannot both project and be keys-only")
	}
	if len(q.distinctOn) != 0 && q.distinct {
		return errors.New("datastore: query cannot be both distinct and distinct-on")
	}
	dst.Reset()
	dst.App = proto.String(appID)
	if q.kind != "" {
		dst.Kind = proto.String(q.kind)
	}
	if q.ancestor != nil {
		dst.Ancestor = keyToProto(appID, q.ancestor)
		if q.eventual {
			dst.Strong = proto.Bool(false)
		}
	}
	if q.projection != nil {
		dst.PropertyName = q.projection
		if len(q.distinctOn) != 0 {
			dst.GroupByPropertyName = q.distinctOn
		}
		if q.distinct {
			dst.GroupByPropertyName = q.projection
		}
	}
	if q.keysOnly {
		dst.KeysOnly = proto.Bool(true)
		dst.RequirePerfectPlan = proto.Bool(true)
	}
	for _, qf := range q.filter {
		if qf.FieldName == "" {
			return errors.New("datastore: empty query filter field name")
		}
		p, errStr := valueToProto(appID, qf.FieldName, reflect.ValueOf(qf.Value), false)
		if errStr != "" {
			return errors.New("datastore: bad query filter value type: " + errStr)
		}
		xf := &pb.Query_Filter{
			Op:       operatorToProto[qf.Op],
			Property: []*pb.Property{p},
		}
		if xf.Op == nil {
			return errors.New("datastore: unknown query filter operator")
		}
		dst.Filter = append(dst.Filter, xf)
	}
	for _, qo := range q.order {
		if qo.FieldName == "" {
			return errors.New("datastore: empty query order field name")
		}
		xo := &pb.Query_Order{
			Property:  proto.String(qo.FieldName),
			Direction: sortDirectionToProto[qo.Direction],
		}
		if xo.Direction == nil {
			return errors.New("datastore: unknown query order direction")
		}
		dst.Order = append(dst.Order, xo)
	}
	if q.limit >= 0 {
		dst.Limit = proto.Int32(q.limit)
	}
	if q.offset != 0 {
		dst.Offset = proto.Int32(q.offset)
	}
	if q.count != 0 {
		dst.Count = proto.Int32(q.count)
	}
	dst.CompiledCursor = q.start
	dst.EndCompiledCursor = q.end
	dst.Compile = proto.Bool(true)
	return nil
}
func ( q * Query ) toProto ( dst * pb . Query , appID string ) error { if len ( q . projection ) != 0 && q . keysOnly { return errors . New ( " " ) } if len ( q . distinctOn ) != 0 && q . distinct { return errors . New ( " " ) } dst . Reset ( ) dst . App = proto . String ( appID ) if q . kind != " " { dst . Kind = proto . String ( q . kind ) } if q . ancestor != nil { dst . Ancestor = keyToProto ( appID , q . ancestor ) if q . eventual { dst . Strong = proto . Bool ( false ) } } if q . projection != nil { dst . PropertyName = q . projection if len ( q . distinctOn ) != 0 { dst . GroupByPropertyName = q . distinctOn } if q . distinct { dst . GroupByPropertyName = q . projection } } if q . keysOnly { dst . KeysOnly = proto . Bool ( true ) dst . RequirePerfectPlan = proto . Bool ( true ) } for _ , qf := range q . filter { if qf . FieldName == " " { return errors . New ( " " ) } p , errStr := valueToProto ( appID , qf . FieldName , reflect . ValueOf ( qf . Value ) , false ) if errStr != " " { return errors . New ( " " + errStr ) } xf := & pb . Query_Filter { Op : operatorToProto [ qf . Op ] , Property : [ ] * pb . Property { p } , } if xf . Op == nil { return errors . New ( " " ) } dst . Filter = append ( dst . Filter , xf ) } for _ , qo := range q . order { if qo . FieldName == " " { return errors . New ( " " ) } xo := & pb . Query_Order { Property : proto . String ( qo . FieldName ) , Direction : sortDirectionToProto [ qo . Direction ] , } if xo . Direction == nil { return errors . New ( " " ) } dst . Order = append ( dst . Order , xo ) } if q . limit >= 0 { dst . Limit = proto . Int32 ( q . limit ) } if q . offset != 0 { dst . Offset = proto . Int32 ( q . offset ) } if q . count != 0 { dst . Count = proto . Int32 ( q . count ) } dst . CompiledCursor = q . start dst . EndCompiledCursor = q . end dst . Compile = proto . Bool ( true ) return nil }
// toProto converts the query to a protocol buffer.
toProto converts the query to a protocol buffer .