MCPcopy
hub / github.com/dgraph-io/dgraph / resolveTokenizers

Function resolveTokenizers

schema/parse.go:414–468  ·  view source on GitHub ↗

resolveTokenizers resolves default tokenizers and verifies tokenizers definitions.

(updates []*pb.SchemaUpdate)

Source from the content-addressed store, hash-verified

412
413// resolveTokenizers resolves default tokenizers and verifies tokenizers definitions.
414func resolveTokenizers(updates []*pb.SchemaUpdate) error {
415 for _, schema := range updates {
416 typ := types.TypeID(schema.ValueType)
417
418 if (typ == types.UidID || typ == types.DefaultID || typ == types.PasswordID) &&
419 schema.Directive == pb.SchemaUpdate_INDEX {
420 return errors.Errorf("Indexing not allowed on predicate %s of type %s",
421 x.ParseAttr(schema.Predicate), typ.Name())
422 }
423
424 if typ == types.UidID {
425 continue
426 }
427
428 if !HasTokenizerOrVectorIndexSpec(schema) &&
429 schema.Directive == pb.SchemaUpdate_INDEX {
430 return errors.Errorf(
431 "Require type of tokenizer for pred: %s of type: %s for indexing.",
432 schema.Predicate, typ.Name())
433 } else if HasTokenizerOrVectorIndexSpec(schema) &&
434 schema.Directive != pb.SchemaUpdate_INDEX {
435 return errors.Errorf("Tokenizers present without indexing on attr %s",
436 x.ParseAttr(schema.Predicate))
437 }
438 // check for valid tokenizer types and duplicates
439 var seen = make(map[string]bool)
440 var seenSortableTok bool
441 for _, t := range schema.Tokenizer {
442 tokenizer, has := tok.GetTokenizer(t)
443 if !has {
444 return errors.Errorf("Invalid tokenizer %s", t)
445 }
446 tokenizerType, ok := types.TypeForName(tokenizer.Type())
447 x.AssertTrue(ok) // Type is validated during tokenizer loading.
448 if tokenizerType != typ {
449 return errors.Errorf("Tokenizer: %s isn't valid for predicate: %s of type: %s",
450 tokenizer.Name(), x.ParseAttr(schema.Predicate), typ.Name())
451 }
452 if _, ok := seen[tokenizer.Name()]; !ok {
453 seen[tokenizer.Name()] = true
454 } else {
455 return errors.Errorf("Duplicate tokenizers present for attr %s",
456 x.ParseAttr(schema.Predicate))
457 }
458 if tokenizer.IsSortable() {
459 if seenSortableTok {
460 return errors.Errorf("More than one sortable index encountered for: %v",
461 schema.Predicate)
462 }
463 seenSortableTok = true
464 }
465 }
466 }
467 return nil
468}
469
470func parseTypeDeclaration(it *lex.ItemIterator, ns uint64) (*pb.TypeUpdate, error) {
471 // Iterator is currently on the token corresponding to the keyword type.

Callers 1

parseFunction · 0.85

Calls 10

TypeIDTypeAlias · 0.92
ParseAttrFunction · 0.92
GetTokenizerFunction · 0.92
TypeForNameFunction · 0.92
AssertTrueFunction · 0.92
NameMethod · 0.65
TypeMethod · 0.65
IsSortableMethod · 0.65
ErrorfMethod · 0.45

Tested by

no test coverage detected