| 284 | } |
| 285 | |
| 286 | func toSchema(attr string, update *pb.SchemaUpdate) *bpb.KV { |
| 287 | // bytes.Buffer never returns error for any of the writes. So, we don't need to check them. |
| 288 | ns, attr := x.ParseNamespaceAttr(attr) |
| 289 | var buf bytes.Buffer |
| 290 | x.Check2(buf.WriteString(fmt.Sprintf("[%#x]", ns))) |
| 291 | x.Check2(buf.WriteRune(' ')) |
| 292 | x.Check2(buf.WriteRune('<')) |
| 293 | x.Check2(buf.WriteString(attr)) |
| 294 | x.Check2(buf.WriteRune('>')) |
| 295 | x.Check2(buf.WriteRune(':')) |
| 296 | if update.GetList() { |
| 297 | x.Check2(buf.WriteRune('[')) |
| 298 | } |
| 299 | x.Check2(buf.WriteString(types.TypeID(update.GetValueType()).Name())) |
| 300 | if update.GetList() { |
| 301 | x.Check2(buf.WriteRune(']')) |
| 302 | } |
| 303 | switch { |
| 304 | case update.GetDirective() == pb.SchemaUpdate_REVERSE: |
| 305 | x.Check2(buf.WriteString(" @reverse")) |
| 306 | case update.GetDirective() == pb.SchemaUpdate_INDEX && len(update.GetTokenizer()) > 0: |
| 307 | x.Check2(buf.WriteString(" @index(")) |
| 308 | x.Check2(buf.WriteString(strings.Join(update.GetTokenizer(), ","))) |
| 309 | x.Check2(buf.WriteRune(')')) |
| 310 | |
| 311 | case len(update.GetIndexSpecs()) != 0: |
| 312 | str := formatVectorSchema(update) |
| 313 | x.Check2(buf.WriteString(str)) |
| 314 | |
| 315 | } |
| 316 | if update.GetCount() { |
| 317 | x.Check2(buf.WriteString(" @count")) |
| 318 | } |
| 319 | if update.GetLang() { |
| 320 | x.Check2(buf.WriteString(" @lang")) |
| 321 | } |
| 322 | if update.GetUpsert() { |
| 323 | x.Check2(buf.WriteString(" @upsert")) |
| 324 | } |
| 325 | if update.GetUnique() { |
| 326 | x.Check2(buf.WriteString(" @unique")) |
| 327 | } |
| 328 | x.Check2(buf.WriteString(" . \n")) |
| 329 | //TODO(Naman): We don't need the version anymore. |
| 330 | return &bpb.KV{ |
| 331 | Value: buf.Bytes(), |
| 332 | Version: 3, // Schema value |
| 333 | } |
| 334 | } |
| 335 | |
| 336 | func formatVectorSchema(schema *pb.SchemaUpdate) string { |
| 337 | var buf bytes.Buffer |