Skip to content

Commit

Permalink
Adds search builder
Browse files Browse the repository at this point in the history
  • Loading branch information
richmahn committed Sep 25, 2024
1 parent 8497870 commit bfd92b1
Show file tree
Hide file tree
Showing 10 changed files with 322 additions and 191 deletions.
1 change: 1 addition & 0 deletions options/locale/locale_en-US.ini
Original file line number Diff line number Diff line change
Expand Up @@ -2628,6 +2628,7 @@ metadata.subject = Subject
metadata.flavor_type = Flavor Type
metadata.flavor = Flavor
metadata.metadata_type = Metadata Type
metadata.content_format = Content Format
metadata.language = Language
metadata.resource = Resource
metadata.abbreviation = Abbreviation
Expand Down
91 changes: 37 additions & 54 deletions routers/web/dcs/catalog.go
Original file line number Diff line number Diff line change
Expand Up @@ -97,48 +97,31 @@ func RenderCatalogSearch(ctx *context.Context, opts *CatalogSearchOptions) {
orderBy = door43metadata.CatalogOrderByNewest
}

var keywords, books, langs, subjects, flavorTypes, flavors, abbreviations, contentFormats, repos, owners, tags, checkingLevels, metadataTypes, metadataVersions, topics []string
stage := door43metadata.StageProd
query := strings.Trim(ctx.FormString("q"), " ")
query := ctx.FormTrim("q")
searchFields := []string{"keyword", "book", "lang", "subject", "flavor_type", "flavor", "abbreviation", "content_format", "repo", "owner", "tag", "checking_level", "metadata_type", "metadata_version", "topic", "stage"}
searchMap := map[string][]string{}
for _, field := range searchFields {
searchMap[field] = []string{}
}
currentField := "keyword"
if query != "" {
for _, token := range door43metadata.SplitAtCommaNotInString(query, true) {
if strings.HasPrefix(token, "book:") {
books = append(books, strings.TrimPrefix(token, "book:"))
} else if strings.HasPrefix(token, "lang:") {
langs = append(langs, strings.TrimPrefix(token, "lang:"))
} else if strings.HasPrefix(token, "subject:") {
subjects = append(subjects, strings.Trim(strings.TrimPrefix(token, "subject:"), `"`))
} else if strings.HasPrefix(token, "flavor_type:") {
flavorTypes = append(flavorTypes, strings.Trim(strings.TrimPrefix(token, "flavor_type:"), `"`))
} else if strings.HasPrefix(token, "flavor:") {
flavors = append(flavors, strings.Trim(strings.TrimPrefix(token, "flavor:"), `"`))
} else if strings.HasPrefix(token, "abbreviation:") {
abbreviations = append(abbreviations, strings.Trim(strings.TrimPrefix(token, "abberviation:"), `"`))
} else if strings.HasPrefix(token, "format:") {
contentFormats = append(contentFormats, strings.Trim(strings.TrimPrefix(token, "format:"), `"`))
} else if strings.HasPrefix(token, "repo:") {
repos = append(repos, strings.TrimPrefix(token, "repo:"))
} else if strings.HasPrefix(token, "owner:") {
owners = append(owners, strings.TrimPrefix(token, "owner:"))
} else if strings.HasPrefix(token, "tag:") {
tags = append(tags, strings.TrimPrefix(token, "tag:"))
} else if strings.HasPrefix(token, "checkinglevel:") {
checkingLevels = append(checkingLevels, strings.TrimPrefix(token, "checkinglevel:"))
} else if strings.HasPrefix(token, "metadata_type:") {
metadataTypes = append(metadataTypes, strings.TrimPrefix(token, "metadata_type:"))
} else if strings.HasPrefix(token, "metadata_version:") {
metadataVersions = append(metadataVersions, strings.TrimPrefix(token, "metadata_version:"))
} else if strings.HasPrefix(token, "topic:") {
topics = append(topics, strings.TrimPrefix(token, "topic:"))
} else if strings.HasPrefix(token, "stage:") {
if s, ok := door43metadata.StageMap[strings.Trim(strings.TrimPrefix(token, "stage:"), `"`)]; ok {
stage = s
} else {
stage = 0 // Makes it invalid, return no results
for _, token := range strings.Split(query, ",") {
token = strings.TrimSpace(token)
value := token
for key := range searchMap {
if strings.HasPrefix(token, key+":") {
currentField = key
value = strings.TrimSpace(strings.TrimPrefix(token, key+":"))
break
}
} else {
keywords = append(keywords, token)
}
searchMap[currentField] = append(searchMap[currentField], value)
}
}
stage := door43metadata.StageProd
if len(searchMap["stage"]) > 0 {
if val, ok := door43metadata.StageMap[searchMap["stage"][0]]; ok {
stage = val
}
}

Expand All @@ -148,23 +131,23 @@ func RenderCatalogSearch(ctx *context.Context, opts *CatalogSearchOptions) {
PageSize: opts.PageSize,
},
OrderBy: []door43metadata.CatalogOrderBy{orderBy},
Keywords: keywords,
Keywords: searchMap["keyword"],
Stage: stage,
IncludeHistory: false,
Books: books,
Subjects: subjects,
FlavorTypes: flavorTypes,
Flavors: flavors,
Abbreviations: abbreviations,
ContentFormats: contentFormats,
Languages: langs,
Repos: repos,
Owners: owners,
MetadataTypes: metadataTypes,
MetadataVersions: metadataVersions,
Topics: topics,
Tags: tags,
CheckingLevels: checkingLevels,
Books: searchMap["book"],
Subjects: searchMap["subject"],
FlavorTypes: searchMap["flavor_type"],
Flavors: searchMap["flavor"],
Abbreviations: searchMap["abbreviation"],
ContentFormats: searchMap["content_format"],
Languages: searchMap["lang"],
Repos: searchMap["repo"],
Owners: searchMap["owner"],
MetadataTypes: searchMap["metadata_type"],
MetadataVersions: searchMap["metadata_version"],
Topics: searchMap["topic"],
Tags: searchMap["tag"],
CheckingLevels: searchMap["checking_level"],
})
if err != nil {
ctx.ServerError("SearchCatalog", err)
Expand Down
71 changes: 29 additions & 42 deletions routers/web/explore/repo.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import (
"strings" // DCS Customizations

"code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/models/door43metadata"
repo_model "code.gitea.io/gitea/models/repo"
"code.gitea.io/gitea/modules/base"
"code.gitea.io/gitea/modules/context"
Expand Down Expand Up @@ -104,39 +103,27 @@ func RenderRepoSearch(ctx *context.Context, opts *RepoSearchOptions) {
ctx.Data["TopicOnly"] = topicOnly

/*** DCS Customizations ***/
var books, langs, keywords, subjects, flavorTypes, flavors, abbreviations, contentFormats, repoNames, owners, metadataTypes, metadataVersions, topics []string
origKeyword := keyword
searchFields := []string{"keyword", "book", "lang", "subject", "flavor_type", "flavor", "abbreviation", "content_format", "repo", "owner", "tag", "checking_level", "metadata_type", "metadata_version", "topic", "stage"}
searchMap := map[string][]string{}
for _, field := range searchFields {
searchMap[field] = []string{}
}
currentField := "keyword"
if keyword != "" {
for _, token := range door43metadata.SplitAtCommaNotInString(keyword, true) {
if strings.HasPrefix(token, "book:") {
books = append(books, strings.TrimPrefix(token, "book:"))
} else if strings.HasPrefix(token, "lang:") {
langs = append(langs, strings.TrimPrefix(token, "lang:"))
} else if strings.HasPrefix(token, "subject:") {
subjects = append(subjects, strings.Trim(strings.TrimPrefix(token, "subject:"), `"`))
} else if strings.HasPrefix(token, "flavor_type:") {
flavorTypes = append(flavorTypes, strings.Trim(strings.TrimPrefix(token, "flavor_type:"), `"`))
} else if strings.HasPrefix(token, "flavor:") {
flavors = append(flavors, strings.Trim(strings.TrimPrefix(token, "flavor:"), `"`))
} else if strings.HasPrefix(token, "abbreviation:") {
abbreviations = append(abbreviations, strings.Trim(strings.TrimPrefix(token, "abbreviation:"), `"`))
} else if strings.HasPrefix(token, "format:") {
contentFormats = append(contentFormats, strings.Trim(strings.TrimPrefix(token, "format:"), `"`))
} else if strings.HasPrefix(token, "repo:") {
repoNames = append(repoNames, strings.TrimPrefix(token, "repo:"))
} else if strings.HasPrefix(token, "owner:") {
owners = append(owners, strings.TrimPrefix(token, "owner:"))
} else if strings.HasPrefix(token, "metadata_type:") {
metadataTypes = append(metadataTypes, strings.TrimPrefix(token, "metadata_type:"))
} else if strings.HasPrefix(token, "metadata_version:") {
metadataVersions = append(metadataVersions, strings.TrimPrefix(token, "metadata_version:"))
} else if strings.HasPrefix(token, "topic:") {
topics = append(topics, strings.TrimPrefix(token, "topic:"))
} else {
keywords = append(keywords, token)
for _, token := range strings.Split(keyword, ",") {
token = strings.TrimSpace(token)
value := token
for key := range searchMap {
if strings.HasPrefix(token, key+":") {
currentField = key
value = strings.TrimSpace(strings.TrimPrefix(token, key+":"))
break
}
}
searchMap[currentField] = append(searchMap[currentField], value)
}
keyword = strings.Join(keywords, ", ")
keyword = strings.Join(searchMap["keyword"], ", ")
}
/*** END DCS Customizations ***/

Expand All @@ -158,18 +145,18 @@ func RenderRepoSearch(ctx *context.Context, opts *RepoSearchOptions) {
TopicOnly: topicOnly,
Language: language,
IncludeDescription: setting.UI.SearchRepoDescription,
Books: books, // DCS Customizaitons
Languages: langs, // DCS Customizaitons
Subjects: subjects, // DCS Customizaitons
FlavorTypes: flavorTypes, // DCS Customizations
Flavors: flavors, // DCS Customizations
Abbreviations: abbreviations, // DCS Customizations
ContentFormats: contentFormats, // DCS Customizations
Repos: repoNames, // DCS Customizaitons
Owners: owners, // DCS Customizaitons
MetadataTypes: metadataTypes, // DCS Customizaitons
MetadataVersions: metadataVersions, // DCS Customizaitons
Topics: topics, // DCS Customizaitons
Books: searchMap["book"], // DCS Customizations
Languages: searchMap["lang"], // DCS Customizations
Subjects: searchMap["subject"], // DCS Customizations
FlavorTypes: searchMap["flavor_type"], // DCS Customizations
Flavors: searchMap["flavor"], // DCS Customizations
Abbreviations: searchMap["abbreviation"], // DCS Customizations
ContentFormats: searchMap["content_format"], // DCS Customizations
Repos: searchMap["repo"], // DCS Customizations
Owners: searchMap["owner"], // DCS Customizations
MetadataTypes: searchMap["metadata_type"], // DCS Customizations
MetadataVersions: searchMap["metadata_version"], // DCS Customizations
Topics: searchMap["topic"], // DCS Customizations
OnlyShowRelevant: opts.OnlyShowRelevant,
})
if err != nil {
Expand Down
68 changes: 29 additions & 39 deletions routers/web/org/home.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import (
"strings"

"code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/models/door43metadata"
"code.gitea.io/gitea/models/organization"
repo_model "code.gitea.io/gitea/models/repo"
user_model "code.gitea.io/gitea/models/user"
Expand Down Expand Up @@ -96,35 +95,26 @@ func Home(ctx *context.Context) {
}

/*** DCS Customizations ***/
var books, langs, keywords, subjects, flavorTypes, flavors, abbreviations, contentFormats, repoNames, owners, metadataTypes, metadataVersions []string
searchFields := []string{"keyword", "book", "lang", "subject", "flavor_type", "flavor", "abbreviation", "content_format", "repo", "owner", "tag", "checking_level", "metadata_type", "metadata_version", "topic", "stage"}
searchMap := map[string][]string{}
for _, field := range searchFields {
searchMap[field] = []string{}
}
currentField := "keyword"
if keyword != "" {
for _, token := range door43metadata.SplitAtCommaNotInString(keyword, true) {
if strings.HasPrefix(token, "book:") {
books = append(books, strings.TrimPrefix(token, "book:"))
} else if strings.HasPrefix(token, "lang:") {
langs = append(langs, strings.TrimPrefix(token, "lang:"))
} else if strings.HasPrefix(token, "subject:") {
subjects = append(subjects, strings.Trim(strings.TrimPrefix(token, "subject:"), `"`))
} else if strings.HasPrefix(token, "flavor_type:") {
flavorTypes = append(flavorTypes, strings.Trim(strings.TrimPrefix(token, "flavor_type:"), `"`))
} else if strings.HasPrefix(token, "flavor:") {
flavors = append(flavors, strings.Trim(strings.TrimPrefix(token, "flavor:"), `"`))
} else if strings.HasPrefix(token, "abbreviation:") {
abbreviations = append(abbreviations, strings.Trim(strings.TrimPrefix(token, "abbreviations:"), `"`))
} else if strings.HasPrefix(token, "format:") {
contentFormats = append(contentFormats, strings.Trim(strings.TrimPrefix(token, "format:"), `"`))
} else if strings.HasPrefix(token, "repo:") {
repoNames = append(repoNames, strings.TrimPrefix(token, "repo:"))
} else if strings.HasPrefix(token, "owner:") {
owners = append(owners, strings.TrimPrefix(token, "owner:"))
} else if strings.HasPrefix(token, "metadata_type:") {
metadataTypes = append(metadataTypes, strings.TrimPrefix(token, "metadata_type:"))
} else if strings.HasPrefix(token, "metadata_version:") {
metadataVersions = append(metadataVersions, strings.TrimPrefix(token, "metadata_version:"))
} else {
keywords = append(keywords, token)
for _, token := range strings.Split(keyword, ",") {
token = strings.TrimSpace(token)
value := token
for key := range searchMap {
if strings.HasPrefix(token, key+":") {
currentField = key
value = strings.TrimSpace(strings.TrimPrefix(token, key+":"))
break
}
}
searchMap[currentField] = append(searchMap[currentField], value)
}
keyword = strings.Join(searchMap["keyword"], ", ")
}
/*** END DCS Customizations ***/

Expand All @@ -138,24 +128,24 @@ func Home(ctx *context.Context) {
PageSize: setting.UI.User.RepoPagingNum,
Page: page,
},
Keyword: strings.Join(keywords, ", "),
Keyword: keyword,
OwnerID: org.ID,
OrderBy: orderBy,
Private: ctx.IsSigned,
Actor: ctx.Doer,
Language: language,
IncludeDescription: setting.UI.SearchRepoDescription,
Books: books, // DCS Customizations
Languages: langs, // DCS Customizations
Subjects: subjects, // DCS Customizations
FlavorTypes: flavorTypes, // DCS Customizations
Flavors: flavors, // DCS Customizations
Abbreviations: abbreviations, // DCS Customizations
ContentFormats: contentFormats, // DCS Customizations
Repos: repoNames, // DCS Customizations
Owners: owners, // DCS Customizations
MetadataTypes: metadataTypes, // DCS Customizations
MetadataVersions: metadataVersions, // DCS Customizations
Books: searchMap["book"], // DCS Customizations
Languages: searchMap["lang"], // DCS Customizations
Subjects: searchMap["subject"], // DCS Customizations
FlavorTypes: searchMap["flavor_type"], // DCS Customizations
Flavors: searchMap["flavor"], // DCS Customizations
Abbreviations: searchMap["abbreviation"], // DCS Customizations
ContentFormats: searchMap["content_format"], // DCS Customizations
Repos: searchMap["repo"], // DCS Customizations
Owners: searchMap["owner"], // DCS Customizations
MetadataTypes: searchMap["metadata_type"], // DCS Customizations
MetadataVersions: searchMap["metadata_version"], // DCS Customizations
})
if err != nil {
ctx.ServerError("SearchRepository", err)
Expand Down
Loading

0 comments on commit bfd92b1

Please sign in to comment.