From 52ebb7562e436ed40aaa0cfd77740e01341e1ac7 Mon Sep 17 00:00:00 2001 From: evgeny Date: Sun, 23 Dec 2018 07:26:47 +0300 Subject: [PATCH 01/12] Added filter for query --- cmd/csearch/csearch.go | 76 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 69 insertions(+), 7 deletions(-) diff --git a/cmd/csearch/csearch.go b/cmd/csearch/csearch.go index 4e12d6ca58..74b859e21b 100644 --- a/cmd/csearch/csearch.go +++ b/cmd/csearch/csearch.go @@ -15,7 +15,7 @@ import ( "github.com/google/codesearch/regexp" ) -var usageMessage = `usage: csearch [-c] [-f fileregexp] [-h] [-i] [-l] [-n] regexp +var usageMessage = `usage: csearch [-c] [-f fileregexp] [-h] [-i] [-l] [-n] regexp [filter for regex] Csearch behaves like grep over all indexed files, searching for regexp, an RE2 (nearly PCRE) regular expression. @@ -66,7 +66,7 @@ func Main() { flag.Parse() args := flag.Args() - if len(args) != 1 { + if len(args) != 2 { usage() } @@ -129,13 +129,75 @@ func Main() { } post = fnames } + if args[1] != "" { + matches = g.Match + var ixFirst = ix + var postFirst = post + var gFirst = g + + pat = "(?m)" + args[1] + if *iFlag { + pat = "(?i)" + pat + } + re, err = regexp.Compile(pat) + if err != nil { + log.Fatal(err) + } + g.Regexp = re + if *fFlag != "" { + fre, err = regexp.Compile(*fFlag) + if err != nil { + log.Fatal(err) + } + } + q = index.RegexpQuery(re.Syntax) + if *verboseFlag { + log.Printf("query: %s\n", q) + } - for _, fileid := range post { - name := ix.Name(fileid) - g.File(name) - } + ix = index.Open(index.File()) + ix.Verbose = *verboseFlag + if *bruteFlag { + post = ix.PostingQuery(&index.Query{Op: index.QAll}) + } else { + post = ix.PostingQuery(q) + } + if *verboseFlag { + log.Printf("post query identified %d possible files\n", len(post)) + } + + if fre != nil { + fnames := make([]uint32, 0, len(post)) - matches = g.Match + for _, fileid := range post { + name := ix.Name(fileid) + if fre.MatchString(name, true, true) < 0 { + continue + } + fnames = append(fnames, fileid) + } + + if *verboseFlag { + log.Printf("filename regexp matched %d files\n", len(fnames)) + } + post = fnames + } + + for _, fileid := range post { + name := ix.Name(fileid) + for _, fileidFirst := range postFirst { + nameFirst := ixFirst.Name(fileidFirst) + if name == nameFirst { + gFirst.File(nameFirst) + } + } + } + } else { + for _, fileid := range post { + name := ix.Name(fileid) + g.File(name) + } + } } func main() { From 2015068ccd47c631675e3b30f7fef40182e51d82 Mon Sep 17 00:00:00 2001 From: evgeny Date: Tue, 25 Dec 2018 04:56:25 +0300 Subject: [PATCH 02/12] Test --- cmd/csearch/csearch.go | 2 +- index/read.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/csearch/csearch.go b/cmd/csearch/csearch.go index 74b859e21b..32336a8dee 100644 --- a/cmd/csearch/csearch.go +++ b/cmd/csearch/csearch.go @@ -11,7 +11,7 @@ import ( "os" "runtime/pprof" - "github.com/google/codesearch/index" + "github.com/Evengining/codesearch/index" "github.com/google/codesearch/regexp" ) diff --git a/index/read.go b/index/read.go index 72ee834418..e48d1d0c6b 100644 --- a/index/read.go +++ b/index/read.go @@ -334,7 +334,7 @@ func (ix *Index) PostingQuery(q *Query) []uint32 { return ix.postingQuery(q, nil) } -func (ix *Index) postingQuery(q *Query, restrict []uint32) (ret []uint32) { +//func (ix *Index) postingQuery(q *Query, restrict []uint32) (ret []uint32) { var list []uint32 switch q.Op { case QNone: From 67c6c5d120c32a7c385645ee99adadd2eb534073 Mon Sep 17 00:00:00 2001 From: evgeny Date: Tue, 25 Dec 2018 07:37:15 +0300 Subject: [PATCH 03/12] Test --- cmd/csearch/csearch.go | 85 ++++++++---------------------------------- index/read.go | 30 ++++++++++++--- 2 files changed, 40 insertions(+), 75 deletions(-) diff --git a/cmd/csearch/csearch.go b/cmd/csearch/csearch.go index 32336a8dee..86c946b4f9 100644 --- a/cmd/csearch/csearch.go +++ b/cmd/csearch/csearch.go @@ -96,7 +96,16 @@ func Main() { log.Fatal(err) } } + fil := "(?m)" + args[1] + if *iFlag { + fil = "(?i)" + fil + } + fi, err := regexp.Compile(fil) + if err != nil { + log.Fatal(err) + } q := index.RegexpQuery(re.Syntax) + filter := index.RegexpQuery(fi.Syntax) if *verboseFlag { log.Printf("query: %s\n", q) } @@ -105,9 +114,9 @@ func Main() { ix.Verbose = *verboseFlag var post []uint32 if *bruteFlag { - post = ix.PostingQuery(&index.Query{Op: index.QAll}) + post = ix.PostingQuery(&index.Query{Op: index.QAll}, filter) } else { - post = ix.PostingQuery(q) + post = ix.PostingQuery(q, filter) } if *verboseFlag { log.Printf("post query identified %d possible files\n", len(post)) @@ -129,75 +138,13 @@ func Main() { } post = fnames } - if args[1] != "" { - matches = g.Match - var ixFirst = ix - var postFirst = post - var gFirst = g - - pat = "(?m)" + args[1] - if *iFlag { - pat = "(?i)" + pat - } - re, err = regexp.Compile(pat) - if err != nil { - log.Fatal(err) - } - g.Regexp = re - if *fFlag != "" { - fre, err = regexp.Compile(*fFlag) - if err != nil { - log.Fatal(err) - } - } - q = index.RegexpQuery(re.Syntax) - if *verboseFlag { - log.Printf("query: %s\n", q) - } - - ix = index.Open(index.File()) - ix.Verbose = *verboseFlag - if *bruteFlag { - post = ix.PostingQuery(&index.Query{Op: index.QAll}) - } else { - post = ix.PostingQuery(q) - } - if *verboseFlag { - log.Printf("post query identified %d possible files\n", len(post)) - } - - if fre != nil { - fnames := make([]uint32, 0, len(post)) - - for _, fileid := range post { - name := ix.Name(fileid) - if fre.MatchString(name, true, true) < 0 { - continue - } - fnames = append(fnames, fileid) - } - if *verboseFlag { - log.Printf("filename regexp matched %d files\n", len(fnames)) - } - post = fnames - } - - for _, fileid := range post { - name := ix.Name(fileid) - for _, fileidFirst := range postFirst { - nameFirst := ixFirst.Name(fileidFirst) - if name == nameFirst { - gFirst.File(nameFirst) - } - } - } - } else { - for _, fileid := range post { - name := ix.Name(fileid) - g.File(name) - } + for _, fileid := range post { + name := ix.Name(fileid) + g.File(name) } + + matches = g.Match } func main() { diff --git a/index/read.go b/index/read.go index e48d1d0c6b..30e0dffeea 100644 --- a/index/read.go +++ b/index/read.go @@ -330,11 +330,25 @@ func (ix *Index) postingOr(list []uint32, trigram uint32, restrict []uint32) []u return x } -func (ix *Index) PostingQuery(q *Query) []uint32 { - return ix.postingQuery(q, nil) +func (ix *Index) PostingQuery(q *Query, filter *Query) []uint32 { + return ix.postingQuery(q, filter, nil) } -//func (ix *Index) postingQuery(q *Query, restrict []uint32) (ret []uint32) { +func (ix *Index) filterPostingQuery(q *Query, list []uint32) (ret []uint32) { + var finds = ix.postingQuery(q, nil, nil) + var ids = make([]uint32, 0, len(finds)) + for _, id := range finds { + for _, listId := range list { + if id != listId { + continue + } + ids = append(ids, id) + } + } + return ids +} + +func (ix *Index) postingQuery(q *Query, filter *Query, restrict []uint32) (ret []uint32) { var list []uint32 switch q.Op { case QNone: @@ -347,7 +361,11 @@ func (ix *Index) PostingQuery(q *Query) []uint32 { for i := range list { list[i] = uint32(i) } - return list + if filter != nil { + ix.filterPostingQuery(filter, list) + } else { + return list + } case QAnd: for _, t := range q.Trigram { tri := uint32(t[0])<<16 | uint32(t[1])<<8 | uint32(t[2]) @@ -364,7 +382,7 @@ func (ix *Index) PostingQuery(q *Query) []uint32 { if list == nil { list = restrict } - list = ix.postingQuery(sub, list) + list = ix.postingQuery(sub, nil, list) if len(list) == 0 { return nil } @@ -379,7 +397,7 @@ func (ix *Index) PostingQuery(q *Query) []uint32 { } } for _, sub := range q.Sub { - list1 := ix.postingQuery(sub, restrict) + list1 := ix.postingQuery(sub, nil, restrict) list = mergeOr(list, list1) } } From 0d35523367b468967b785f102e4fdbc773fa5744 Mon Sep 17 00:00:00 2001 From: evgeny Date: Tue, 25 Dec 2018 07:41:22 +0300 Subject: [PATCH 04/12] Test --- index/read.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/index/read.go b/index/read.go index 30e0dffeea..c8701c6ead 100644 --- a/index/read.go +++ b/index/read.go @@ -362,7 +362,8 @@ func (ix *Index) postingQuery(q *Query, filter *Query, restrict []uint32) (ret [ list[i] = uint32(i) } if filter != nil { - ix.filterPostingQuery(filter, list) + list = ix.filterPostingQuery(filter, list) + return list } else { return list } From 7b056e76a9bfa53d7bcccf947aa8b970cde54123 Mon Sep 17 00:00:00 2001 From: evgeny Date: Tue, 25 Dec 2018 07:43:28 +0300 Subject: [PATCH 05/12] Test --- index/read.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/index/read.go b/index/read.go index c8701c6ead..a8170a181f 100644 --- a/index/read.go +++ b/index/read.go @@ -388,6 +388,9 @@ func (ix *Index) postingQuery(q *Query, filter *Query, restrict []uint32) (ret [ return nil } } + if filter != nil { + list = ix.filterPostingQuery(filter, list) + } case QOr: for _, t := range q.Trigram { tri := uint32(t[0])<<16 | uint32(t[1])<<8 | uint32(t[2]) @@ -401,6 +404,9 @@ func (ix *Index) postingQuery(q *Query, filter *Query, restrict []uint32) (ret [ list1 := ix.postingQuery(sub, nil, restrict) list = mergeOr(list, list1) } + if filter != nil { + list = ix.filterPostingQuery(filter, list) + } } return list } From ed5388e1131a7fdb7364905e0685085b465ef9c4 Mon Sep 17 00:00:00 2001 From: evgeny Date: Tue, 25 Dec 2018 07:46:03 +0300 Subject: [PATCH 06/12] Test --- index/read.go | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/index/read.go b/index/read.go index a8170a181f..67bd1027ed 100644 --- a/index/read.go +++ b/index/read.go @@ -336,16 +336,16 @@ func (ix *Index) PostingQuery(q *Query, filter *Query) []uint32 { func (ix *Index) filterPostingQuery(q *Query, list []uint32) (ret []uint32) { var finds = ix.postingQuery(q, nil, nil) - var ids = make([]uint32, 0, len(finds)) + var findsIds = make([]uint32, 0, len(finds)) for _, id := range finds { for _, listId := range list { if id != listId { continue } - ids = append(ids, id) + findsIds = append(findsIds, id) } } - return ids + return findsIds } func (ix *Index) postingQuery(q *Query, filter *Query, restrict []uint32) (ret []uint32) { @@ -363,9 +363,6 @@ func (ix *Index) postingQuery(q *Query, filter *Query, restrict []uint32) (ret [ } if filter != nil { list = ix.filterPostingQuery(filter, list) - return list - } else { - return list } case QAnd: for _, t := range q.Trigram { From 922e4828e549c21d6680ad7f84cabb95101836ab Mon Sep 17 00:00:00 2001 From: evgeny Date: Tue, 25 Dec 2018 07:51:36 +0300 Subject: [PATCH 07/12] Edited names --- cmd/csearch/csearch.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cmd/csearch/csearch.go b/cmd/csearch/csearch.go index 86c946b4f9..eb1d2e5816 100644 --- a/cmd/csearch/csearch.go +++ b/cmd/csearch/csearch.go @@ -96,16 +96,16 @@ func Main() { log.Fatal(err) } } - fil := "(?m)" + args[1] + filter := "(?m)" + args[1] if *iFlag { - fil = "(?i)" + fil + filter = "(?i)" + filter } - fi, err := regexp.Compile(fil) + filterRe, err := regexp.Compile(filter) if err != nil { log.Fatal(err) } q := index.RegexpQuery(re.Syntax) - filter := index.RegexpQuery(fi.Syntax) + filterQuery := index.RegexpQuery(filterRe.Syntax) if *verboseFlag { log.Printf("query: %s\n", q) } @@ -114,9 +114,9 @@ func Main() { ix.Verbose = *verboseFlag var post []uint32 if *bruteFlag { - post = ix.PostingQuery(&index.Query{Op: index.QAll}, filter) + post = ix.PostingQuery(&index.Query{Op: index.QAll}, filterQuery) } else { - post = ix.PostingQuery(q, filter) + post = ix.PostingQuery(q, filterQuery) } if *verboseFlag { log.Printf("post query identified %d possible files\n", len(post)) From 1f388df1974a9a49d27c128409f861050714b4ec Mon Sep 17 00:00:00 2001 From: evgeny Date: Tue, 25 Dec 2018 04:48:27 +0300 Subject: [PATCH 08/12] Test --- index/read.go | 34 ++++++---------------------------- 1 file changed, 6 insertions(+), 28 deletions(-) diff --git a/index/read.go b/index/read.go index 67bd1027ed..72ee834418 100644 --- a/index/read.go +++ b/index/read.go @@ -330,25 +330,11 @@ func (ix *Index) postingOr(list []uint32, trigram uint32, restrict []uint32) []u return x } -func (ix *Index) PostingQuery(q *Query, filter *Query) []uint32 { - return ix.postingQuery(q, filter, nil) +func (ix *Index) PostingQuery(q *Query) []uint32 { + return ix.postingQuery(q, nil) } -func (ix *Index) filterPostingQuery(q *Query, list []uint32) (ret []uint32) { - var finds = ix.postingQuery(q, nil, nil) - var findsIds = make([]uint32, 0, len(finds)) - for _, id := range finds { - for _, listId := range list { - if id != listId { - continue - } - findsIds = append(findsIds, id) - } - } - return findsIds -} - -func (ix *Index) postingQuery(q *Query, filter *Query, restrict []uint32) (ret []uint32) { +func (ix *Index) postingQuery(q *Query, restrict []uint32) (ret []uint32) { var list []uint32 switch q.Op { case QNone: @@ -361,9 +347,7 @@ func (ix *Index) postingQuery(q *Query, filter *Query, restrict []uint32) (ret [ for i := range list { list[i] = uint32(i) } - if filter != nil { - list = ix.filterPostingQuery(filter, list) - } + return list case QAnd: for _, t := range q.Trigram { tri := uint32(t[0])<<16 | uint32(t[1])<<8 | uint32(t[2]) @@ -380,14 +364,11 @@ func (ix *Index) postingQuery(q *Query, filter *Query, restrict []uint32) (ret [ if list == nil { list = restrict } - list = ix.postingQuery(sub, nil, list) + list = ix.postingQuery(sub, list) if len(list) == 0 { return nil } } - if filter != nil { - list = ix.filterPostingQuery(filter, list) - } case QOr: for _, t := range q.Trigram { tri := uint32(t[0])<<16 | uint32(t[1])<<8 | uint32(t[2]) @@ -398,12 +379,9 @@ func (ix *Index) postingQuery(q *Query, filter *Query, restrict []uint32) (ret [ } } for _, sub := range q.Sub { - list1 := ix.postingQuery(sub, nil, restrict) + list1 := ix.postingQuery(sub, restrict) list = mergeOr(list, list1) } - if filter != nil { - list = ix.filterPostingQuery(filter, list) - } } return list } From 211a7e7f9f951d764820059b9b369a1f87d6e73a Mon Sep 17 00:00:00 2001 From: evgeny Date: Tue, 25 Dec 2018 04:50:34 +0300 Subject: [PATCH 09/12] Test --- cmd/csearch/csearch.go | 87 +++++++++++++++++++++++++++++++++--------- 1 file changed, 70 insertions(+), 17 deletions(-) diff --git a/cmd/csearch/csearch.go b/cmd/csearch/csearch.go index eb1d2e5816..74b859e21b 100644 --- a/cmd/csearch/csearch.go +++ b/cmd/csearch/csearch.go @@ -11,7 +11,7 @@ import ( "os" "runtime/pprof" - "github.com/Evengining/codesearch/index" + "github.com/google/codesearch/index" "github.com/google/codesearch/regexp" ) @@ -96,16 +96,7 @@ func Main() { log.Fatal(err) } } - filter := "(?m)" + args[1] - if *iFlag { - filter = "(?i)" + filter - } - filterRe, err := regexp.Compile(filter) - if err != nil { - log.Fatal(err) - } q := index.RegexpQuery(re.Syntax) - filterQuery := index.RegexpQuery(filterRe.Syntax) if *verboseFlag { log.Printf("query: %s\n", q) } @@ -114,9 +105,9 @@ func Main() { ix.Verbose = *verboseFlag var post []uint32 if *bruteFlag { - post = ix.PostingQuery(&index.Query{Op: index.QAll}, filterQuery) + post = ix.PostingQuery(&index.Query{Op: index.QAll}) } else { - post = ix.PostingQuery(q, filterQuery) + post = ix.PostingQuery(q) } if *verboseFlag { log.Printf("post query identified %d possible files\n", len(post)) @@ -138,13 +129,75 @@ func Main() { } post = fnames } + if args[1] != "" { + matches = g.Match + var ixFirst = ix + var postFirst = post + var gFirst = g + + pat = "(?m)" + args[1] + if *iFlag { + pat = "(?i)" + pat + } + re, err = regexp.Compile(pat) + if err != nil { + log.Fatal(err) + } + g.Regexp = re + if *fFlag != "" { + fre, err = regexp.Compile(*fFlag) + if err != nil { + log.Fatal(err) + } + } + q = index.RegexpQuery(re.Syntax) + if *verboseFlag { + log.Printf("query: %s\n", q) + } - for _, fileid := range post { - name := ix.Name(fileid) - g.File(name) - } + ix = index.Open(index.File()) + ix.Verbose = *verboseFlag + if *bruteFlag { + post = ix.PostingQuery(&index.Query{Op: index.QAll}) + } else { + post = ix.PostingQuery(q) + } + if *verboseFlag { + log.Printf("post query identified %d possible files\n", len(post)) + } + + if fre != nil { + fnames := make([]uint32, 0, len(post)) + + for _, fileid := range post { + name := ix.Name(fileid) + if fre.MatchString(name, true, true) < 0 { + continue + } + fnames = append(fnames, fileid) + } - matches = g.Match + if *verboseFlag { + log.Printf("filename regexp matched %d files\n", len(fnames)) + } + post = fnames + } + + for _, fileid := range post { + name := ix.Name(fileid) + for _, fileidFirst := range postFirst { + nameFirst := ixFirst.Name(fileidFirst) + if name == nameFirst { + gFirst.File(nameFirst) + } + } + } + } else { + for _, fileid := range post { + name := ix.Name(fileid) + g.File(name) + } + } } func main() { From ddbc4be98a5532a6a4ec9399206a67cd1264a612 Mon Sep 17 00:00:00 2001 From: evgeny Date: Tue, 25 Dec 2018 04:52:47 +0300 Subject: [PATCH 10/12] Test --- cmd/csearch/csearch.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/csearch/csearch.go b/cmd/csearch/csearch.go index 74b859e21b..93e7048e84 100644 --- a/cmd/csearch/csearch.go +++ b/cmd/csearch/csearch.go @@ -11,7 +11,7 @@ import ( "os" "runtime/pprof" - "github.com/google/codesearch/index" + "github.com/evengining/codesearch/index" "github.com/google/codesearch/regexp" ) From 371a7b010c4ef31f16438f95f8d7127cf9d2bda8 Mon Sep 17 00:00:00 2001 From: evgeny Date: Tue, 25 Dec 2018 04:54:45 +0300 Subject: [PATCH 11/12] Test --- cmd/csearch/csearch.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/csearch/csearch.go b/cmd/csearch/csearch.go index 93e7048e84..659915ef4f 100644 --- a/cmd/csearch/csearch.go +++ b/cmd/csearch/csearch.go @@ -11,7 +11,7 @@ import ( "os" "runtime/pprof" - "github.com/evengining/codesearch/index" + "github.com/Evengining/codesearch" "github.com/google/codesearch/regexp" ) From 3202c9fd4df2ef7ed48a031628ba3dc958345cfc Mon Sep 17 00:00:00 2001 From: evgeny Date: Tue, 25 Dec 2018 08:06:21 +0300 Subject: [PATCH 12/12] Refactor --- cmd/csearch/csearch.go | 87 +++++++++--------------------------------- index/read.go | 34 ++++++++++++++--- 2 files changed, 45 insertions(+), 76 deletions(-) diff --git a/cmd/csearch/csearch.go b/cmd/csearch/csearch.go index 659915ef4f..eb1d2e5816 100644 --- a/cmd/csearch/csearch.go +++ b/cmd/csearch/csearch.go @@ -11,7 +11,7 @@ import ( "os" "runtime/pprof" - "github.com/Evengining/codesearch" + "github.com/Evengining/codesearch/index" "github.com/google/codesearch/regexp" ) @@ -96,7 +96,16 @@ func Main() { log.Fatal(err) } } + filter := "(?m)" + args[1] + if *iFlag { + filter = "(?i)" + filter + } + filterRe, err := regexp.Compile(filter) + if err != nil { + log.Fatal(err) + } q := index.RegexpQuery(re.Syntax) + filterQuery := index.RegexpQuery(filterRe.Syntax) if *verboseFlag { log.Printf("query: %s\n", q) } @@ -105,9 +114,9 @@ func Main() { ix.Verbose = *verboseFlag var post []uint32 if *bruteFlag { - post = ix.PostingQuery(&index.Query{Op: index.QAll}) + post = ix.PostingQuery(&index.Query{Op: index.QAll}, filterQuery) } else { - post = ix.PostingQuery(q) + post = ix.PostingQuery(q, filterQuery) } if *verboseFlag { log.Printf("post query identified %d possible files\n", len(post)) @@ -129,75 +138,13 @@ func Main() { } post = fnames } - if args[1] != "" { - matches = g.Match - var ixFirst = ix - var postFirst = post - var gFirst = g - - pat = "(?m)" + args[1] - if *iFlag { - pat = "(?i)" + pat - } - re, err = regexp.Compile(pat) - if err != nil { - log.Fatal(err) - } - g.Regexp = re - if *fFlag != "" { - fre, err = regexp.Compile(*fFlag) - if err != nil { - log.Fatal(err) - } - } - q = index.RegexpQuery(re.Syntax) - if *verboseFlag { - log.Printf("query: %s\n", q) - } - - ix = index.Open(index.File()) - ix.Verbose = *verboseFlag - if *bruteFlag { - post = ix.PostingQuery(&index.Query{Op: index.QAll}) - } else { - post = ix.PostingQuery(q) - } - if *verboseFlag { - log.Printf("post query identified %d possible files\n", len(post)) - } - - if fre != nil { - fnames := make([]uint32, 0, len(post)) - - for _, fileid := range post { - name := ix.Name(fileid) - if fre.MatchString(name, true, true) < 0 { - continue - } - fnames = append(fnames, fileid) - } - if *verboseFlag { - log.Printf("filename regexp matched %d files\n", len(fnames)) - } - post = fnames - } - - for _, fileid := range post { - name := ix.Name(fileid) - for _, fileidFirst := range postFirst { - nameFirst := ixFirst.Name(fileidFirst) - if name == nameFirst { - gFirst.File(nameFirst) - } - } - } - } else { - for _, fileid := range post { - name := ix.Name(fileid) - g.File(name) - } + for _, fileid := range post { + name := ix.Name(fileid) + g.File(name) } + + matches = g.Match } func main() { diff --git a/index/read.go b/index/read.go index 72ee834418..67bd1027ed 100644 --- a/index/read.go +++ b/index/read.go @@ -330,11 +330,25 @@ func (ix *Index) postingOr(list []uint32, trigram uint32, restrict []uint32) []u return x } -func (ix *Index) PostingQuery(q *Query) []uint32 { - return ix.postingQuery(q, nil) +func (ix *Index) PostingQuery(q *Query, filter *Query) []uint32 { + return ix.postingQuery(q, filter, nil) } -func (ix *Index) postingQuery(q *Query, restrict []uint32) (ret []uint32) { +func (ix *Index) filterPostingQuery(q *Query, list []uint32) (ret []uint32) { + var finds = ix.postingQuery(q, nil, nil) + var findsIds = make([]uint32, 0, len(finds)) + for _, id := range finds { + for _, listId := range list { + if id != listId { + continue + } + findsIds = append(findsIds, id) + } + } + return findsIds +} + +func (ix *Index) postingQuery(q *Query, filter *Query, restrict []uint32) (ret []uint32) { var list []uint32 switch q.Op { case QNone: @@ -347,7 +361,9 @@ func (ix *Index) postingQuery(q *Query, restrict []uint32) (ret []uint32) { for i := range list { list[i] = uint32(i) } - return list + if filter != nil { + list = ix.filterPostingQuery(filter, list) + } case QAnd: for _, t := range q.Trigram { tri := uint32(t[0])<<16 | uint32(t[1])<<8 | uint32(t[2]) @@ -364,11 +380,14 @@ func (ix *Index) postingQuery(q *Query, restrict []uint32) (ret []uint32) { if list == nil { list = restrict } - list = ix.postingQuery(sub, list) + list = ix.postingQuery(sub, nil, list) if len(list) == 0 { return nil } } + if filter != nil { + list = ix.filterPostingQuery(filter, list) + } case QOr: for _, t := range q.Trigram { tri := uint32(t[0])<<16 | uint32(t[1])<<8 | uint32(t[2]) @@ -379,9 +398,12 @@ func (ix *Index) postingQuery(q *Query, restrict []uint32) (ret []uint32) { } } for _, sub := range q.Sub { - list1 := ix.postingQuery(sub, restrict) + list1 := ix.postingQuery(sub, nil, restrict) list = mergeOr(list, list1) } + if filter != nil { + list = ix.filterPostingQuery(filter, list) + } } return list }