func sortToProto(sort *SortOptions, params *pb.SearchParams) error { for _, e := range sort.Expressions { spec := &pb.SortSpec{ SortExpression: proto.String(e.Expr), } if e.Reverse { spec.SortDescending = proto.Bool(false) } if e.Default != nil { switch d := e.Default.(type) { case float64: spec.DefaultValueNumeric = &d case string: spec.DefaultValueText = &d default: return fmt.Errorf("search: invalid Default type %T for expression %q", d, e.Expr) } } params.SortSpec = append(params.SortSpec, spec) } spec := &pb.ScorerSpec{} if sort.Limit > 0 { spec.Limit = proto.Int32(int32(sort.Limit)) params.ScorerSpec = spec } if sort.Scorer != nil { sort.Scorer.toProto(spec) params.ScorerSpec = spec } return nil }
func (o *autoFacetOpt) setParams(params *pb.SearchParams) error { lim := int32(o.facetLimit) if lim == 0 { lim = defaultAutoFacetLimit } params.AutoDiscoverFacetCount = &lim if o.valueLimit > 0 { params.FacetAutoDetectParam = &pb.FacetAutoDetectParam{ ValueLimit: proto.Int32(int32(o.valueLimit)), } } return nil }
func (o *facetOpt) setParams(params *pb.SearchParams) error { req := &pb.FacetRequest{Name: &o.name} params.IncludeFacet = append(params.IncludeFacet, req) if len(o.values) == 0 { return nil } vtype := reflect.TypeOf(o.values[0]) reqParam := &pb.FacetRequestParam{} for _, v := range o.values { if reflect.TypeOf(v) != vtype { return errors.New("values must all be Atom, or must all be Range") } switch v := v.(type) { case Atom: reqParam.ValueConstraint = append(reqParam.ValueConstraint, string(v)) case Range: rng, err := rangeToProto(v) if err != nil { return fmt.Errorf("invalid range: %v", err) } reqParam.Range = append(reqParam.Range, rng) default: return fmt.Errorf("unsupported value type %T", v) } } req.Params = reqParam return nil }
func refinementsToProto(refinements []Facet, params *pb.SearchParams) error { for _, r := range refinements { ref := &pb.FacetRefinement{ Name: proto.String(r.Name), } switch v := r.Value.(type) { case Atom: ref.Value = proto.String(string(v)) case Range: rng, err := rangeToProto(v) if err != nil { return fmt.Errorf("search: refinement for facet %q: %v", r.Name, err) } // Unfortunately there are two identical messages for identify Facet ranges. ref.Range = &pb.FacetRefinement_Range{Start: rng.Start, End: rng.End} default: return fmt.Errorf("search: unsupported refinement for facet %q of type %T", r.Name, v) } params.FacetRefinement = append(params.FacetRefinement, ref) } return nil }
func (o facetDepthOpt) setParams(params *pb.SearchParams) error { params.FacetDepth = proto.Int32(int32(o)) return nil }