Skip to content

Commit 5b2568a

Browse files
committed
feat: improve function and module search
1 parent c84732e commit 5b2568a

File tree

3 files changed

+112
-58
lines changed

3 files changed

+112
-58
lines changed

src/main/xar-resources/collection.xconf

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
<collection xmlns="http://exist-db.org/collection-config/1.0">
22
<index xmlns:xqdoc="http://www.xqdoc.org/1.0">
3-
<fulltext default="none" attributes="false"/>
3+
<range>
4+
<create qname="xqdoc:uri" />
5+
<create qname="xqdoc:location" />
6+
</range>
47
<ngram qname="xqdoc:name"/>
58
<ngram qname="xqdoc:signature"/>
69
<ngram qname="xqdoc:description"/>

src/main/xar-resources/modules/app.xqm

Lines changed: 79 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -47,55 +47,107 @@ declare function app:check-not-dba-user-and-not-data($node as node(), $model as
4747

4848
declare
4949
%templates:default("action", "search")
50-
%templates:default("type", "name")
50+
%templates:default("where", "everywhere")
5151
function app:action(
5252
$node as node(), $model as map(*),
5353
$action as xs:string,
5454
$module as xs:string?,
55-
$q as xs:string?, $type as xs:string
55+
$q as xs:string?, $where as xs:string
5656
) as map(*) {
5757
switch ($action)
58-
case "browse" return app:browse($node, $module)
59-
case "search" return app:search($node, $q, $type)
58+
case "browse" return app:browse($module)
59+
case "search" return
60+
switch ($where)
61+
case "description" return app:search-in-description($q)
62+
case "location" return app:search-in-module-location($q)
63+
case "signature" return app:search-in-signature($q)
64+
case "name" return app:search-in-module-name($q)
65+
case "everywhere" return app:search-everywhere($q)
66+
default return app:search-everywhere($q)
6067
default return map { "result": () }
6168
};
6269

6370
declare %private
64-
function app:browse($node as node(), $module as xs:string?) as map(*) {
71+
function app:browse($module as xs:string?) as map(*) {
6572
let $module := $app:data[xqdoc:module/xqdoc:uri = $module]
6673
return map { "result": $module//xqdoc:function }
6774
};
6875

6976
declare %private
70-
function app:search(
71-
$node as node(), $q as xs:string?, $type as xs:string
72-
) as map(*) {
73-
let $functions :=
74-
switch( $type )
75-
case "name" return
76-
$app:data//xqdoc:function[ngram:contains(xqdoc:name, $q)]
77-
case "signature" return
78-
$app:data//xqdoc:function[ngram:contains(xqdoc:signature, $q)]
79-
case "desc" return
80-
$app:data//xqdoc:function[ngram:contains(xqdoc:comment/xqdoc:description, $q)]
81-
default return ()
82-
return
83-
map { "result": $functions }
77+
function app:search-in-module-location($q as xs:string?) as map(*) {
78+
map {
79+
"result": $app:data//(
80+
xqdoc:control[contains(xqdoc:location, $q)]/..//xqdoc:function
81+
)
82+
}
83+
};
84+
85+
declare %private
86+
function app:search-in-module-name($q as xs:string?) as map(*) {
87+
map {
88+
"result": $app:data//(
89+
xqdoc:module[contains(xqdoc:uri, $q)]/..//xqdoc:function
90+
)
91+
}
92+
};
93+
94+
declare %private
95+
function app:search-in-description($q as xs:string?) as map(*) {
96+
map {
97+
"result": $app:data//(
98+
xqdoc:function[ngram:contains(xqdoc:comment/xqdoc:description, $q)]
99+
|
100+
xqdoc:module[ngram:contains(xqdoc:comment/xqdoc:description, $q)]
101+
)
102+
}
103+
};
104+
105+
declare %private
106+
function app:search-in-signature($q as xs:string?) as map(*) {
107+
map {
108+
"result": $app:data//(
109+
xqdoc:function[ngram:contains(xqdoc:name, $q)]
110+
|
111+
xqdoc:function[ngram:contains(xqdoc:signature, $q)]
112+
)
113+
}
114+
};
115+
116+
declare %private
117+
function app:search-everywhere($q as xs:string?) as map(*) {
118+
map {
119+
"result": $app:data//(
120+
xqdoc:function[ngram:contains(xqdoc:name, $q)]
121+
|
122+
xqdoc:function[ngram:contains(xqdoc:signature, $q)]
123+
|
124+
xqdoc:function[ngram:contains(xqdoc:comment/xqdoc:description, $q)]
125+
|
126+
xqdoc:control[contains(xqdoc:location, $q)]/..//xqdoc:function
127+
|
128+
xqdoc:module[contains(xqdoc:uri, $q)]/..//xqdoc:function
129+
|
130+
xqdoc:module[ngram:contains(xqdoc:comment/xqdoc:description, $q)]
131+
|
132+
xqdoc:module[ngram:contains(xqdoc:name, $q)]/..//xqdoc:function
133+
)
134+
}
84135
};
85136

86137
declare
87138
%templates:default("details", "false")
88139
function app:module($node as node(), $model as map(*), $details as xs:boolean) {
89140
let $functions := $model("result")
90-
for $module in $functions/ancestor::xqdoc:xqdoc
91-
let $uri := $module/xqdoc:module/xqdoc:uri/text()
92-
let $location := $module/xqdoc:control/xqdoc:location/text()
93-
let $order := (if ($location) then $location else " " || $uri)
94-
let $funcsInModule := $module//xqdoc:function intersect $functions
95-
96-
order by $order
97141
return
98-
app:print-module($module, $funcsInModule, $details)
142+
for $module in $functions/ancestor::xqdoc:xqdoc
143+
let $uri := $module/xqdoc:module/xqdoc:uri/text()
144+
let $location := $module/xqdoc:control/xqdoc:location/text()
145+
let $order := (if ($location) then $location else " " || $uri)
146+
let $funcsInModule := $module//xqdoc:function intersect $functions
147+
148+
order by $order
149+
return
150+
app:print-module($module, $funcsInModule, $details)
99151
};
100152

101153
declare %private

src/main/xar-resources/templates/pages/index.html

Lines changed: 29 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -4,39 +4,38 @@
44
<h1>XQuery Function Documentation</h1>
55
<form id="fun-query-form" name="f-query" class="form-horizontal" action="?" method="GET">
66
<div class="row mb-3">
7-
<label class="col-form-label col-md-2 hidden-xs">Search</label>
8-
<div class="col-md-4 col-xs-12">
9-
<span class="input-group">
10-
<input id="query-field" name="q" type="text" data-template="templates:form-control" class="form-control"/>
11-
<span class="input-group-btn">
12-
<button id="f-btn-search" type="submit" name="action" value="search" class="btn btn-primary">
13-
<span class="glyphicon glyphicon-search"></span> Search
14-
</button>
15-
</span>
16-
</span>
7+
<div class="col-lg-6 col-md-8 col-sm-12 mb-1">
8+
<div class="input-group">
9+
<input id="query-field" name="q" type="text" placeholder="Start typing to search for modules and functions..." data-template="templates:form-control" class="form-control"/>
10+
<button id="f-btn-search" type="submit" name="action" value="search" class="btn btn-lg btn-primary">
11+
<span class="glyphicon glyphicon-search"></span> Search
12+
</button>
13+
</div>
1714
</div>
18-
</div>
19-
<div class="row mb-3">
20-
<label class="col-form-label col-md-2 hidden-xs">Search in</label>
21-
<div class="col-md-4 col-xs-12">
22-
<select name="type" data-template="templates:form-control" class="form-select">
23-
<option value="name">Name</option>
24-
<option value="signature">Signature</option>
25-
<option value="desc">Description</option>
26-
</select>
15+
<div class="col-lg-6 col-md-4 col-sm-12">
16+
<div class="input-group">
17+
<label class="input-group-text form-label-lg" for="searchWhereSelect">Where?</label>
18+
<select id="searchWhereSelect" name="where" data-template="templates:form-control" class="form-select form-select-lg">
19+
<option value="everywhere">everywhere</option>
20+
<option value="signature">in signatures only</option>
21+
<option value="description">in descriptions only</option>
22+
<option value="location">in module locations only</option>
23+
<option value="name">in module names only</option>
24+
</select>
25+
</div>
2726
</div>
2827
</div>
29-
<div class="btn-toolbar">
30-
<div class="btn-group me-2" role="group" aria-label="browse action">
31-
<a id="browse" class="btn btn-primary" href="browse?extensions=true">
32-
<span class="glyphicon glyphicon-globe"></span> Browse</a>
33-
</div>
34-
<div class="btn-group me-2" role="group" aria-label="generate action">
35-
<button id="f-btn-reindex-regen" class="btn btn-warning" data-template="app:check-dba-user-and-data" data-toggle="tooltip" data-placement="top" title="Regenerate XQuery Function Documentation after modification or addition of functions">
36-
<span class="glyphicon glyphicon-refresh"></span> Regenerate</button>
37-
<button id="f-btn-reindex" class="btn btn-warning" data-template="app:check-not-data" data-toggle="tooltip" data-placement="top" title="Generate XQuery Function Documentation after installation">
38-
<span class="glyphicon glyphicon-import"></span> Generate</button>
39-
<img id="f-load-indicator" src="resources/images/ajax-loader.gif"/>
28+
<div class="row mb-3">
29+
<div class="btn-toolbar col-lg-6 col-md-12">
30+
<div class="btn-group me-2" role="group" aria-label="browse action">
31+
<a id="browse" class="btn btn-lg btn-primary" href="browse?extensions=true">
32+
<span class="glyphicon glyphicon-globe"></span> Browse</a>
33+
</div>
34+
<div class="btn-group me-2" role="group" aria-label="generate action">
35+
<button id="f-btn-reindex-regen" class="btn btn-lg btn-warning" data-template="app:check-dba-user-and-data" data-toggle="tooltip" data-placement="top" title="Regenerate XQuery Function Documentation after modification or addition of functions">
36+
<span class="glyphicon glyphicon-refresh"></span> Regenerate</button>
37+
<img id="f-load-indicator" src="resources/images/ajax-loader.gif"/>
38+
</div>
4039
</div>
4140
</div>
4241
</form>

0 commit comments

Comments
 (0)