func removeAlreadyAppliedTagValuePairs(store *storage.Storage, tx *storage.Tx, pairs []entities.TagIdValueIdPair, file *entities.File) ([]entities.TagIdValueIdPair, error) { log.Infof(2, "%v: determining existing file-tags", file.Path()) existingFileTags, err := store.FileTagsByFileId(tx, file.Id, false) if err != nil { return nil, fmt.Errorf("%v: could not determine file's tags: %v", file.Path(), err) } log.Infof(2, "%v: determining implied tags", file.Path()) newImplications, err := store.ImplicationsFor(tx, pairs...) if err != nil { return nil, fmt.Errorf("%v: could not determine implied tags: %v", file.Path(), err) } log.Infof(2, "%v: revising set of tags to apply", file.Path()) revisedPairs := make([]entities.TagIdValueIdPair, 0, len(pairs)) for _, pair := range pairs { predicate := func(ft entities.FileTag) bool { return ft.TagId == pair.TagId && ft.ValueId == pair.ValueId } if existingFileTags.Any(predicate) { continue } if newImplications.Implies(pair) { continue } revisedPairs = append(revisedPairs, pair) } return revisedPairs, nil }