require 'voruby/adql/adql'
require 'rexml/element'
module VORuby
module ADQL
class ScalarExpression
def to_adqls
self.value
end
end
class ClosedExpr
def to_adqls
"(#{self.value.to_adqls})"
end
end
class BinaryOperator
def to_adqls
self.operator
end
end
class BinaryExpr
def to_adqls
"#{self.arg1.to_adqls} #{self.oper.to_adqls} #{self.arg2.to_adqls}"
end
end
class UnaryOperator
def to_adqls
self.operator
end
end
class UnaryExpr
def to_adqls
"#{self.oper.to_adqls}#{self.arg.to_adqls}"
end
end
class ColumnReference
def to_adqls
"#{self.table}.#{self.name}"
end
def to_adqlx(element_name)
"<#{element_name} Name=\"#{self.name}\" Table=\"#{self.table}\" " +
"xsi:type=\"columnReferenceType\"/>"
end
end
class Atom
def to_adqls
lit_value = self.literal
if lit_value.is_a?(StringType)
"'#{lit_value.to_adqls}#{self.unit || ''}'"
else
"#{lit_value.to_adqls}#{self.unit || ''}"
end
end
def to_adqlx(element_name)
literal_type = ''
if self.literal.is_a?(ADQL::RealType)
literal_type = 'realType'
elsif self.literal.is_a?(ADQL::IntegerType)
literal_type = 'integerType'
elsif self.literal.is_a?(ADQL::StringType)
literal_type = 'stringType'
end
atom = "<#{element_name} xsi:type=\"atomType\">\n"
atom << self.literal.to_adqlx(literal_type)
atom << "\n#{element_name}>\n"
return atom
end
end
class LiteralType
def to_adqls
self.value.to_s
end
def to_adqlx(literal_type)
""
end
end
class SelectionOption
def to_adqls
self.option.option
end
end
class AllOrDistinct
def to_adqls
self.option
end
end
class TrigonometricFunctionName
def to_adqls
self.value
end
end
class TrigonometricFunction
def to_adqls
if self.allow
"#{self.name.to_adqls}(#{self.allow.to_adqls} #{self.arg.to_adqls})"
else
"#{self.name.to_adqls}(#{self.arg.to_adqls})"
end
end
end
class MathFunctionName
def to_adqls
self.value
end
end
class MathFunction
def to_adqls
if self.allow
"#{self.name.to_adqls}(#{self.allow.to_adqls} #{self.arg.to_adqls})"
else
"#{self.name.to_adqls}(#{self.arg.to_adqls})"
end
end
end
class AggregateFunctionName
def to_adqls
self.value
end
end
class AggregateFunction
def to_adqls
if self.allow
"#{self.name.to_adqls}(#{self.allow.to_adqls} #{self.arg.to_adqls})"
else
"#{self.name.to_adqls}(#{self.arg.to_adqls})"
end
end
end
class AliasSelectionItem
def to_adqls
if self.as
"#{self.expression.to_adqls} AS #{self.as}"
else
self.expression.to_adqls
end
end
end
class AllSelectionItem
def to_adqls
'*'
end
def to_adqlx(element_name)
"<#{element_name} xsi:type=\"allSelectionItemType\"/>"
end
end
class Comparison
def to_adqls
self.value
end
def to_adqlx
self.value
end
end
class ArchiveTable
def to_adqls
if self.alias_name
"#{self.archive}:#{self.name} #{self.alias_name}"
else
"#{self.archive}:#{self.name}"
end
end
def to_adqlx
if self.alias_name
"
"
else
"
"
end
end
end
class Table
def to_adqls
if self.alias_name
"#{self.name} #{self.alias_name}"
else
self.name
end
end
end
class XMatchTableAlias
def to_adqls
self.name
end
end
class DropTable
def to_adqls
"!#{self.name}"
end
end
class IntersectionSearch
def to_adqls
"#{self.cond1.to_adqls} AND #{self.cond2.to_adqls}"
end
def to_adqlx
intersection_search = "\n"
intersection_search << self.cond1.to_adqlx
intersection_search << self.cond2.to_adqlx
intersection_search << "\n"
return intersection_search
end
end
class UnionSearch
def to_adqls
"#{self.cond1.to_adqls} OR #{self.cond2.to_adqls}"
end
def to_adqlx
union_search = "\n"
union_search << self.cond1.to_adqlx
union_search << self.cond2.to_adqlx
union_search << "\n"
return union_search
end
end
class XMatch
def to_adqls
tables = self.tables.collect{|x| x.to_adqls}.join(', ')
"XMATCH(#{tables}) #{nature.value} #{sigma.value}"
end
end
class LikePred
def to_adqls
"#{self.arg.to_adqls} LIKE #{self.pattern.to_adqls}"
end
def to_adqlx
like_pred = "\n"
like_pred << self.arg.to_adqlx('Arg') + "\n"
like_pred << self.pattern.to_adqlx('Pattern')
like_pred << "\n"
return like_pred
end
end
class NotLikePred
def to_adqls
"#{self.arg.to_adqls} NOT LIKE #{self.pattern.to_adqls}"
end
end
class SubQuerySet
def to_adqls
self.selection.to_adqls
end
end
class ClosedSearch
def to_adqls
"(#{self.condition.to_adqls})"
end
end
class ComparisonPred
def to_adqls
"#{self.arg1.to_adqls} #{self.comparison.to_adqls} #{self.arg2.to_adqls}"
end
def to_adqlx
comparison_pred = "\n"
comparison_pred << self.arg1.to_adqlx('Arg') + "\n"
comparison_pred << self.arg2.to_adqlx('Arg')
comparison_pred << "\n"
return comparison_pred
end
end
class BetweenPred
def to_adqls
"#{self.arg1.to_adqls} BETWEEN #{self.arg2.to_adqls} AND #{self.arg3.to_adqls}"
end
def to_adqlx
between_pred = "\n"
between_pred << self.arg1.to_adqlx('Arg') + "\n"
between_pred << self.arg2.to_adqlx('Arg')
between_pred << self.arg3.to_adqlx('Arg')
between_pred << "\n"
return between_pred
end
end
class NotBetweenPred
def to_adqls
"#{self.arg1.to_adqls} NOT BETWEEN #{self.arg2.to_adqls} AND #{self.arg3.to_adqls}"
end
end
class Circle
def to_adqls
"#{self.shape.to_adqls} #{self.system.to_adqls} #{self.ra.to_adqls} #{self.dec.to_adqls} #{self.radius.to_adqls}"
end
def to_adqlx
circle = "xsi:type=\"reg:circleType\" unit=\"deg\">\n"
circle << "#{self.ra.value} #{self.dec.value}\n"
circle << "#{self.radius.value}\n"
return circle
end
end
class Box
def to_adqls
"#{self.shape.to_adqls} #{self.system.to_adqls} " +
"#{self.ra.to_adqls} #{self.dec.to_adqls} " +
"#{self.dra.to_adqls} #{self.ddec.to_adqls}"
end
def to_adqlx
box = "xsi:type=\"reg:boxType\">\n"
box << "#{self.ra.value} #{self.dec.value}\n"
box << "#{self.dra.value} #{self.ddec.value}\n"
return box
end
end
class RegionSearch
def to_adqls
"Region('#{self.shape.to_adqls}')"
end
def to_adqlx
region = "\n"
region << "\n"
region << "\n"
return region
end
end
class InverseSearch
def to_adqls
"NOT #{self.condition.to_adqls}"
end
end
class Having
def to_adqls
"HAVING #{self.condition.to_adqls}"
end
end
class GroupBy
def to_adqls
cols = self.columns.collect{|x| x.to_adqls}.join(', ')
"GROUP BY #{cols}"
end
end
class Where
def to_adqls
"WHERE #{self.condition.to_adqls}" if self.condition
end
def to_adqlx
if self.condition
where = "\n"
where << self.condition.to_adqlx
where << "\n\n"
return where
end
end
end
class From
def to_adqls
tables = self.tables.collect{|x| x.to_adqls}.join(', ')
"FROM #{tables}"
end
def to_adqlx
from = "\n"
from << self.tables.collect{|x| x.to_adqlx}.join("\n")
from << "\n\n"
return from
end
end
class SelectionList
def to_adqls
self.items.collect{|x| x.to_adqls}.join(', ')
end
def to_adqlx
selection_list = "\n"
selection_list << self.items.collect{|x| x.to_adqlx('Item')}.join("\n")
selection_list << "\n\n"
return selection_list
end
end
class SelectionLimit
def to_adqls
"TOP #{self.top}"
end
end
class Into
def to_adqls
"INTO #{self.table_name}"
end
end
class OrderDirection
def to_adqls
self.value
end
end
class OrderOption
def to_adqls
self.direction.to_adqls
end
end
class Order
def to_adqls
if self.order
"#{self.expression.to_adqls} #{self.order.to_adqls}"
else
"#{self.expression.to_adqls}"
end
end
end
class OrderExpression
def to_adqls
items = self.items.collect{|x| x.to_adqls}.join(', ')
"ORDER BY #{items}"
end
end
class ConstantListSet
def to_adqls
self.items.collect{ |x|
if x.is_a?(NumberType)
x.to_adqls
else
"\"#{x.to_adqls}\""
end
}.join(', ')
end
end
class InclusiveSearch
def to_adqls
"#{self.expression.to_adqls} IN (#{self.set.to_adqls})"
end
end
class ExclusiveSearch
def to_adqls
"#{self.expression.to_adqls} NOT IN (#{self.set.to_adqls})"
end
end
class Select
def to_adqls
select = 'SELECT'
select << " #{self.allow.to_adqls}" if self.allow
select << " #{self.restrict.to_adqls}" if self.restrict
select << " #{self.selection_list.to_adqls}"
select << " #{self.in_to.to_adqls}" if self.in_to
select << " #{self.from.to_adqls}" if self.from
select << " #{self.where.to_adqls}" if self.where
select << " #{self.group_by.to_adqls}" if self.group_by
select << " #{self.having.to_adqls}" if self.having
select << " #{self.order_by.to_adqls}" if self.order_by
return select
end
def to_adqlx
adqlx = "\n" +
""
return adqlx
end
end
class UserDefinedFunction
def to_adqls
params = ''
if self.params and self.params.size > 0
params = self.params.collect{|x| x.to_adqls}.join(', ')
end
"#{self.name}(#{params})"
end
end
class JointTableQualifier
def to_adqls
self.value
end
end
class JoinTable
def to_adqls
"#{self.qualifier.to_adqls} #{self.tables.to_adqls} ON #{self.condition.to_adqls}"
end
end
class ArrayOfFromTable
def to_adqls
self.from_tables.collect{|x| x.to_adqls}.join(', ')
end
end
class Unit
def to_adqls
self.unit
end
end
end
end