I finally got some Sequel code working to replace a honkin' big query
in an old MSSQL stored proc. I would appreciate any advice someone may
offer on a better way to achieve the same goal.
Following the Sequel code is the original SQL from the MSSQL stored
proc for reference.
# Working query (using grep for postgresql case-insensitive matches
with future support for case-sensitive)
def search
s = /#{request['q']}/i
lang_id = request['langID']
lang_id = nil if lang_id && lang_id.empty?
@lang = OJLanguage[lang_id] if lang_id
@title = "Search of ObjJob for '#{request['q']}' #{" in #
{[email protected]_name}" if @lang}"
valid_o = @lang ? @lang.objects_dataset : OJObject.dataset
valid_m = OJMethod.filter( :object_id=>valid_o.select(:id) )
valid_p = OJProperty.filter( :object_id=>valid_o.select(:id) )
valid_c = OJConstant.filter( :object_id=>valid_o.select(:id) )
valid_a = OJArgument.filter( :method_id=>valid_m.select(:id) )
nulli = "NULL::integer"
no_o = "#{nulli} AS o_id"
no_p = "#{nulli} AS p_id"
no_m = "#{nulli} AS m_id"
no_c = "#{nulli} AS c_id"
o_name = valid_o.grep( :name, s ).select( "60 AS weight, id
AS o_id, #{no_m}, #{no_p}, #{no_c}".lit )
o_view = valid_o.grep( :overview, s ).select( "30 AS weight, id
AS o_id, #{no_m}, #{no_p}, #{no_c}".lit )
o_desc = valid_o.grep( :description, s ).select( "10 AS weight, id
AS o_id, #{no_m}, #{no_p}, #{no_c}".lit )
m_name = valid_m.grep( :name, s ).select( "60 AS weight, #
{no_o}, id AS m_id, #{no_p}, #{no_c}".lit )
m_view = valid_m.grep( :overview, s ).select( "20 AS weight, #
{no_o}, id AS m_id, #{no_p}, #{no_c}".lit )
m_desc = valid_m.grep( :description, s ).select( " 5 AS weight, #
{no_o}, id AS m_id, #{no_p}, #{no_c}".lit )
a_name = valid_a.grep( :name, s ).select( "10 AS weight, #
{no_o}, method_id AS m_id, #{no_p}, #{no_c}".lit )
a_view = valid_a.grep( :overview, s ).select( " 5 AS weight, #
{no_o}, method_id AS m_id, #{no_p}, #{no_c}".lit )
p_name = valid_p.grep( :name, s ).select( "60 AS weight, #
{no_o}, #{no_m}, id AS property_id, #{no_c}".lit )
p_view = valid_p.grep( :overview, s ).select( "30 AS weight, #
{no_o}, #{no_m}, id AS property_id, #{no_c}".lit )
p_desc = valid_p.grep( :description, s ).select( "10 AS weight, #
{no_o}, #{no_m}, id AS property_id, #{no_c}".lit )
c_name = valid_c.grep( :name, s ).select( "70 AS weight, #
{no_o}, #{no_m}, #{no_p}, id AS constant_id".lit )
c_view = valid_c.grep( :overview, s ).select( "30 AS weight, #
{no_o}, #{no_m}, #{no_p}, id AS constant_id".lit )
weights_on_ids = [ o_name, o_view, o_desc,
m_name, m_view, m_desc, a_name, a_view,
p_name, p_view, p_desc,
c_name, c_view ].inject{ |all,ds| all.union
(ds) }.as(:weights_on_ids)
weighted_ids = DB.dataset.from( weights_on_ids )
.select( "SUM(weight) AS
weight".lit, :o_id, :m_id, :p_id, :c_id )
.group_by( :o_id, :m_id, :p_id, :c_id )
.order( :weight.desc ).as( :weighted_ids )
@results = DB.dataset.from( weighted_ids )
.left_outer_join
( :objects, :id=>:weighted_ids__o_id )
.left_outer_join
( :methods, :id=>:weighted_ids__m_id )
.left_outer_join
( :properties, :id=>:weighted_ids__p_id )
.left_outer_join
( :constants, :id=>:weighted_ids__c_id )
.select(
:weight,
:o_id, :objects__name___o_name,
:objects__overview___o_overview,
:m_id, :methods__name___m_name,
:methods__overview___m_overview,
:p_id, :properties__name___p_name,
:properties__overview___p_overview,
:c_id, :constants__name___c_name,
:constants__overview___c_overview
)
.all
end
# Original MSSQL stored proc:
IF @langID IS NULL
SELECT foo.weight,
foo.objID,o.objName,
foo.methID,m.methodName,
foo.propID,p.propName,
foo.constID,c.constName,
foo.langID,t_Languages.langName
FROM (
SELECT SUM(weight) AS weight,langID,objID,methID,propID,constID
FROM (
SELECT langID,objID,NULL AS methID,NULL AS propID,NULL AS
constID, 60 AS weight FROM t_Objects o WHERE objName LIKE
@searchString
UNION
SELECT langID,objID,NULL,NULL,NULL,30 AS weight FROM t_Objects o
WHERE overview LIKE @searchString
UNION
SELECT langID,objID,NULL,NULL,NULL,10 AS weight FROM t_Objects o
WHERE description LIKE @searchString
UNION
SELECT langID,NULL,id,NULL,NULL,60 AS weight FROM t_Methods m
INNER JOIN t_Objects o ON m.objID=o.objID WHERE methodName
LIKE @searchString
UNION
SELECT langID,NULL,id,NULL,NULL,20 AS weight FROM t_Methods m
INNER JOIN t_Objects o ON m.objID=o.objID WHERE m.overview
LIKE @searchString
UNION
SELECT langID,NULL,id,NULL,NULL,5 AS weight FROM t_Methods m
INNER JOIN t_Objects o ON m.objID=o.objID WHERE m.description
LIKE @searchString
UNION
SELECT langID,NULL,methodID,NULL,NULL,10 AS weight FROM
t_MethodArguments a
INNER JOIN t_Methods m ON a.methodID=m.id
INNER JOIN t_Objects o ON m.objID=o.objID WHERE argName LIKE
@searchString
UNION
SELECT langID,NULL,methodID,NULL,NULL,5 AS weight FROM
t_MethodArguments a
INNER JOIN t_Methods m ON a.methodID=m.id
INNER JOIN t_Objects o ON m.objID=o.objID WHERE a.overview
LIKE @searchString
UNION
SELECT langID,NULL,NULL,id,NULL,60 AS weight FROM t_Properties p
INNER JOIN t_Objects o ON p.objID=o.objID WHERE propName LIKE
@searchString
UNION
SELECT langID,NULL,NULL,id,NULL,30 AS weight FROM t_Properties p
INNER JOIN t_Objects o ON p.objID=o.objID WHERE p.overview
LIKE @searchString
UNION
SELECT langID,NULL,NULL,id,NULL,10 AS weight FROM t_Properties
p
INNER JOIN t_Objects o ON p.objID=o.objID WHERE p.description
LIKE @searchString
UNION
SELECT langID,NULL,NULL,NULL,id,70 AS weight FROM t_Constants c
INNER JOIN t_Objects o ON c.objID=o.objID WHERE c.constName
LIKE @searchString
UNION
SELECT langID,NULL,NULL,NULL,id,30 AS weight FROM t_Constants c
INNER JOIN t_Objects o ON c.objID=o.objID WHERE c.overview
LIKE @searchString
) every
GROUP BY langID,objid,methid,propID,constID
) foo
INNER JOIN t_Languages ON foo.langID=t_Languages.langID
LEFT OUTER JOIN t_Objects o ON foo.objID=o.objID
LEFT OUTER JOIN t_Methods m ON foo.methID=m.id
LEFT OUTER JOIN t_Properties p ON foo.propID=p.id
LEFT OUTER JOIN t_Constants c ON foo.constID=c.id
ORDER BY weight DESC,langName,objName,methodName,propName,constName
ELSE
SELECT foo.weight,
foo.objID,o.objName,
foo.methID,m.methodName,
foo.propID,p.propName,
foo.constID,c.constName
FROM (
SELECT SUM(weight) AS weight,objID,methID,propID,constID FROM (
SELECT objID,NULL AS methID,NULL AS propID,NULL AS constID,60 AS
weight FROM t_Objects o WHERE lang...@langid AND objName LIKE
@searchString
UNION
SELECT objID,NULL,NULL,NULL,30 AS weight FROM t_Objects o WHERE
lang...@langid AND overview LIKE @searchString
UNION
SELECT objID,NULL,NULL,NULL,10 AS weight FROM t_Objects o WHERE
lang...@langid AND description LIKE @searchString
UNION
SELECT NULL,id,NULL,NULL,60 AS weight FROM t_Methods m
INNER JOIN t_Objects o ON m.objID=o.objID WHERE
o.lang...@langid AND methodName LIKE @searchString
UNION
SELECT NULL,id,NULL,NULL,20 AS weight FROM t_Methods m
INNER JOIN t_Objects o ON m.objID=o.objID WHERE
o.lang...@langid AND m.overview LIKE @searchString
UNION
SELECT NULL,id,NULL,NULL,5 AS weight FROM t_Methods m
INNER JOIN t_Objects o ON m.objID=o.objID WHERE
o.lang...@langid AND m.description LIKE @searchString
UNION
SELECT NULL,methodID,NULL,NULL,10 AS weight FROM
t_MethodArguments a
INNER JOIN t_Methods m ON a.methodID=m.id
INNER JOIN t_Objects o ON m.objID=o.objID WHERE
o.lang...@langid AND argName LIKE @searchString
UNION
SELECT NULL,methodID,NULL,NULL,5 AS weight FROM
t_MethodArguments a
INNER JOIN t_Methods m ON a.methodID=m.id
INNER JOIN t_Objects o ON m.objID=o.objID WHERE
o.lang...@langid AND a.overview LIKE @searchString
UNION
SELECT NULL,NULL,id,NULL,60 AS weight FROM t_Properties p
INNER JOIN t_Objects o ON p.objID=o.objID WHERE
o.lang...@langid AND propName LIKE @searchString
UNION
SELECT NULL,NULL,id,NULL,30 AS weight FROM t_Properties p
INNER JOIN t_Objects o ON p.objID=o.objID WHERE
o.lang...@langid AND p.overview LIKE @searchString
UNION
SELECT NULL,NULL,id,NULL,10 AS weight FROM t_Properties p
INNER JOIN t_Objects o ON p.objID=o.objID WHERE
o.lang...@langid AND p.description LIKE @searchString
UNION
SELECT NULL,NULL,NULL,c.id,70 AS weight FROM t_Constants c
INNER JOIN t_Objects o ON c.objID=o.objID WHERE
o.lang...@langid AND c.constName LIKE @searchString
UNION
SELECT NULL,NULL,NULL,c.id,30 AS weight FROM t_Constants c
INNER JOIN t_Objects o ON c.objID=o.objID WHERE
o.lang...@langid AND c.overview LIKE @searchString
) every
GROUP BY objid,methid,propID,constID
) foo
LEFT OUTER JOIN t_Objects o ON foo.objID=o.objID
LEFT OUTER JOIN t_Methods m ON foo.methID=m.id
LEFT OUTER JOIN t_Properties p ON foo.propID=p.id
LEFT OUTER JOIN t_Constants c ON foo.constID=c.id
ORDER BY weight DESC,objName,methodName,propName,constName
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"sequel-talk" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/sequel-talk?hl=en
-~----------~----~----~----~------~----~------~--~---