| Oracle Context Option Application Developer's Guide | Library |
Product |
Contents |
Index |
The topics covered in this chapter are:
Note: The CTXQUERY sample Forms application does not utilize any of the theme querying functionality provided by ConText Option.
However, the sample application could be theme-query enabled for English-language documents simply by creating a theme indexing policy, indexing the column with the policy, and referencing the policy in the query block.
For more information about theme queries and theme indexing policies, see "Theme Queries (Chapter 4)".
Before the sample form can be used, the demonstration installation scripts must be run. The demonstration installation scripts are provided with ConText Option and are installed automatically on the server machine during ConText Option installation.
For more information about running the demonstration installation scripts, see the Oracle7 Server installation documentation specific to your operating system.
When-New-Form-Instance
set_window_property
(FORMS_MDI_WINDOW, WINDOW_STATE, MAXIMIZE);
set_window_property('CTXQUERY', WINDOW_STATE, MAXIMIZE);
select query_id.nextval
into :global.query_id
from dual;This maximizes the windows for display, then selects a query ID from a sequence.
This form is designed so that it can be used by multiple concurrent users, which means that the results tables are shared. When result tables are shared, a unique query ID separates each user's results from other users. In this form the unique ID is created as an increasing sequence of numbers with the last value stored in a global variable.
Each widget is part of the QUERY block, which is a non-base-table block. There is one hidden field in this screen, QUERY_STRING.
When the Query button is pressed, the When-Button-Pressed trigger goes to the HITLIST block and executes a query:
When-Button-Pressed on BUTTONS.QUERY
go_block('hitlist');
clear_block(no_validate);
execute_query(all_records);The HITLIST block is based on the ARTICLE_HITLIST view. This view joins the query result table QUERY_TEMP and the base table ARTICLES into a hitlist which has both score and article information. Although this block contains items for all the fields in this view, most are hidden. The visible page displays score, author, section, and title.
Pre-Query on HITLIST
build_query_string;
ctx_query.contains('DEMO_POLICY',
:query.query_string,
'QUERY_TEMP',
1,
:global.query_id,
0,1,null);
-- -- limit the relational fields to the query criteria --
:hitlist.conid := :global.query_id; :hitlist.author := :query.author; :hitlist.section := :query.section; copy(:query.pub_date,'hitlist.pub_date');
BUILD_QUERY_STRING is divided into sections A through E.
PROCEDURE build_query_string IS BEGIN
-- -- Section A --
:query.query_string := null;
-- -- Section B --
if (:query.qterm1 is not null) then :query.query_string := :query.query_string || :query.qexp1 ||
'{' || :query.qterm1 || '}' ||
'*' || to_char(nvl(:query.qwt1, 1)) ||
substr(:query.qop1,2,1);
end if;
if (:query.qterm2 is not null) then
:query.query_string := :query.query_string ||
:query.qexp2 ||
'{' || :query.qterm2 || '}' ||
'*' || to_char(nvl(:query.qwt2, 1)) ||
substr(:query.qop2,2,1);
end if;
if (:query.qterm3 is not null) then
:query.query_string := :query.query_string ||
:query.qexp3 ||
'{' || :query.qterm3 || '}' ||
'*' || to_char(nvl(:query.qwt3, 1));
end if;
-- -- Section C --
:query.query_string := rtrim(:query.query_string, '&|,;-');
-- -- Section D --
if (:query.qthresh is not null) then
:query.query_string := '(' || :query.query_string ||
')>' || to_char(:query.qthresh);
end if;
-- -- Section E --
if (:query.qlimit is not null) then
:query.query_string := '(' || :query.query_string ||
'):' || to_char(:query.qlimit);
end if;
END;
When-Mouse-Double-Click on HITLIST.TITLE
GO_BLOCK('VIEW');
EXECUTE_QUERY;In order to display the correct article, the Pre-Query trigger limits the VIEW block to display the article highlighted in the HITLIST block:
Pre-Query on VIEW:
:view.article_id := :hitlist.article_id;
The VIEW block is based on ARTICLES, and displays the full text of the article.
The HIGHLIGHT procedure is divided into sections A and B.
| TABLE | HIGHLIGHT_TEMP | |
| COLUMNS | ID | NUMBER |
| OFFSET | NUMBER | |
| LENGTH | NUMBER | |
| STRENGTH | NUMBER | |
It is not possible to do an INSTR for the search terms because of the expansion operators; for example, go=going=gone in a STEM expansion. Instead, use the highlight procedure in Section A to generate the highlights table.
This table holds the offset and the length of each word to be highlighted.
The asterisks insert won't change the other offsets. For each offset, length pair, the asterisks are inserted by reassigning the full text to: everything before the term (line 1), then the asterisks, then the term and some more asterisks (line 2) then everything after the term (line 3). Doing this repeatedly highlights all the terms in the document.
PROCEDURE highlight IS cursor highcur is select offset, length from highlight_temp where id = :global.query_id order by offset desc;
-- -- Section A --
BEGIN ctx_query.highlight( 'DEMO_POLICY', -- policy name to_char(:view.article_id), -- textkey :query.query_string, -- query string :global.query_id, -- query_id
null, null, 'HIGHLIGHT_TEMP', -- highlight table null, null, null, null);
-- -- Section B --
for hc in highcur loop 1. :view.text := substr(:view.text,1,hc.offset - 1) || 2. '***'||substr(:view.text,hc.offset,hc.length)||'***'|| 3. substr(:view.text,hc.offset+hc.length); end loop; END;
The VIEW block contains pre-UPDATE and pre-INDEX triggers that perform the necessary reindexing when there is a change to article data. Both triggers invoke the REINDEX_ARTICLE procedure.
The REINDEX_ARTICLE procedure performs the following tasks:
For more information about DML and reindexing, see Oracle ConText Option Administrator's Guide.
PROCEDURE reindex_article IS
handle number;
begin
# # Section A #
ctx_dml.reindex('demo_policy', TO_CHAR(:view.article_id));
# # Section B #
delete from article_themes
where pk = :view.article_id;
delete from article_gists where pk = :view.article_id;
# # Section C #
ctx_ling.REQUEST_themes('demo_policy',
TO_CHAR(:view.article_id),
'article_themes');
ctx_ling.REQUEST_gist('demo_policy',
TO_CHAR(:view.article_id),
'article_gists');
# # Section D #
handle := ctx_ling.submit(0,FALSE,0); end;
Post-Form
delete from query_temp where conid = to_number(:global.query_id);
delete from highlight_temp where id = to_number(:global.query_id);
standard.commit;
The standard.commit executes an Oracle COMMIT without doing a Forms commit_form.
|
Prev Next |
Copyright © 1996 Oracle Corporation. All Rights Reserved. |
Library |
Product |
Contents |
Index |