class QObject

this file is part of manqod manqod is distributed under the CDDL licence the author of manqod is Dobai-Pataky Balint(dpblnt@gmail.com)

Attributes

obj_id[R]
obj_type[R]

Public Class Methods

new(q,link_or_fields=nil) click to toggle source

q - the QueryBuilder link_or_fields - link: an object from the RelationBuilder

- fields: the fields from the table `qobjects`
Calls superclass method
# File lib/FormHolder/Form/InputHolder/QBuilder/QObject.rb, line 12
def initialize(q,link_or_fields=nil)
        whsv=false
        begin
                whsv=Gtk::SourceView::BUILD_VERSION
                rescue => err
                einfo("no Gtk::SourceView, falling back")
        end
        super() #("initializing")
        pack_start(Gtk::ScrolledWindow.new.set_policy(Gtk::PolicyType::AUTOMATIC,Gtk::PolicyType::NEVER).set_shadow_type(Gtk::ShadowType::NONE).add(@widget=whsv ? Gtk::SourceView.new : Gtk::TextView.new))
        @rel_reverted=false
        @q=q
        @custom="false"
        case link_or_fields.class.name
                when "Hash" then
                        #load
                        @my_id=link_or_fields["id"]
                        @obj_type=link_or_fields["obj_type"]
                        @obj_id=link_or_fields["obj_id"]
                        @field=link_or_fields["field"]
                        @custom=link_or_fields["custom"]
                        @rel_reverted=!@field.nil? && @field.include?("reverted")
                        set_link_from_data
                when "RField" then
                        @link=link_or_fields
                        @my_id=nil
                        @obj_type="f"
                        @field=link.field_name
                        @obj_id=link.table.table_id
                        store
                when "RTable" then
                        @link=link_or_fields
                        @my_id=nil
                        @obj_type="b"
                        @obj_id=link.table_id
                        store
                when "Relation" then
                        @link=link_or_fields
                        @my_id=nil
                        @obj_type="r"
                        @obj_id=link.relation_id.to_i
                        store
                else edebug("unknown link: #{@link}(#{link_or_fields.class.name})","relation-builder",WARNING)
        end

        if whsv
                @widget.buffer.set_language(Gtk::SourceLanguageManager.new.get_language("sql"))
                @widget.set_auto_indent(true).
                set_highlight_current_line(true).
                set_indent_on_tab(true).
                set_indent_on_tab(true).
                set_indent_width(4)
        end
        @widget.set_editable(is_custom?)
        @widget.modify_base(Gtk::StateType::NORMAL,Gdk::Color.parse("yellow")) if is_custom?
        @widget.signal_connect("focus-out-event"){|me,ev|
                @field=text
                store
                @q.update(@q)
                false
                }
        @q.qobjects.push(self)
        case @obj_type
                when "b" then @q.from.pack_start(self,false,false)
                when "f" then
                        @q.select.pack_start(self,false,false)
                        pack_start(rmbutton=Gtk::Button.new.set_image(Gtk::Image.new(Gtk::Stock::CANCEL,Gtk::IconSize::MENU)).set_relief(Gtk::ReliefStyle::NONE),false)
                        rmbutton.signal_connect("clicked"){|me| self.delete}
                when "r" then
                        @q.from.pack_start(self,false,false)
                        pack_start(rotbutton=Gtk::ToggleButton.new.set_image(Gtk::Image.new(Gtk::Stock::REFRESH,Gtk::IconSize::MENU)).set_relief(Gtk::ReliefStyle::NONE),false)
                        pack_start(rmbutton=Gtk::Button.new,false)
                        rmbutton.set_image(Gtk::Image.new(Gtk::Stock::CANCEL,Gtk::IconSize::MENU)).set_relief(Gtk::ReliefStyle::NONE).signal_connect("clicked"){|me| self.delete}
                        rotbutton.set_active(@rel_reverted)
                        rotbutton.signal_connect("toggled"){|me| 
                                @rel_reverted=me.active?
                                store
                                @q.update(@q)
                        }
        end
        show_all
        case @link.class.name
                when "RField","Relation" then @link.set_active(true)
        end
end

Public Instance Methods

delete() click to toggle source
# File lib/FormHolder/Form/InputHolder/QBuilder/QObject.rb, line 221
def delete
        query("delete from `qobjects` where id='#{@my_id}'") if @my_id
        @q.qobjects.delete(self)
        self.destroy
        if is_custom?
                #so all qobjects get updated
                @q.update(@q)
        else
                #update the link, that will also update all qobjects
                case @link.class.name
                        when "RField" then @link.set_active(false)
                        when "Relation" then @link.set_active(false)
                end
        end
end
find_base_dir(rel,been_there=nil) click to toggle source
# File lib/FormHolder/Form/InputHolder/QBuilder/QObject.rb, line 103
def find_base_dir(rel,been_there=nil)
        if been_there.nil?
                been_there=Array.new
        end
        been_there.push(rel.relation_id)
        ret=nil
        ret=rel.rfield1 if rel.rfield1.table.table_id.to_i == @q.base_object.obj_id.to_i
        ret=rel.rfield2 if rel.rfield2.table.table_id.to_i == @q.base_object.obj_id.to_i
        unless ret
                @q.rb.relations.each_pair{|rel_id,r|
                        unless been_there.include?(r.relation_id)
                                if r.rfield1.table.table_id == rel.rfield1.table.table_id or r.rfield2.table.table_id == rel.rfield1.table.table_id 
                                        if other_dir=find_base_dir(r,been_there)
                                                ret=rel.rfield1
                                        end
                                end
                                if r.rfield1.table.table_id == rel.rfield2.table.table_id or r.rfield2.table.table_id == rel.rfield2.table.table_id 
                                        if other_dir=find_base_dir(r,been_there)
                                                ret=rel.rfield2
                                        end
                                end
                                break if ret
                        end
                }
        end
        ret
end
gen_text() click to toggle source
# File lib/FormHolder/Form/InputHolder/QBuilder/QObject.rb, line 131
def gen_text
        ret=""
        if is_custom?
                ret=@field || ""
        else
                begin
                        case @obj_type
                                when "f" then ret="`#{@link.table.table}`.`#{@link.field_name}`#{"," unless last_field?}"
                                when "r" then
                                        dir=find_base_dir(@link)
                                        dir=@link.other_field(dir) if @rel_reverted #reverted path
                                        edebug("field to base: #{dir}","relation-builder",INFO)
                                        if dir
                                                other_field=@link.other_field(dir)
                                                edebug("field to base other_field: #{other_field}","relation-builder",INFO)
                                                if @link.rel_name == ""
                                                        ret="left join `#{other_field.table.table}` on `#{other_field.table.table}`.`#{other_field.field_name}` = `#{dir.table.table}`.`#{dir.field_name}`"
                                                else
                                                        ret="left join `#{other_field.table.table}` as #{@link.rel_name} on `#{@link.rel_name}`.`#{other_field.field_name}` = `#{dir.table.table}`.`#{dir.field_name}`"
                                                end
                                                unless @link.rel_custom == ""
                                                        ret="#{ret} and #{@link.rel_custom}"
                                                end
                                        else
                                                ret="can't reach base"
                                        end
                                when "b" then
                                        ret="`#{@link.table}`"
                                else ret="unknown object type"
                        end
                rescue =>err
                        edebug("#{err}, #{backtrace_to_debug(err)}\n","relation-builder","warning")
                        ret="unavailable object"
                end
        end
        ret
end
inspect() click to toggle source
# File lib/FormHolder/Form/InputHolder/QBuilder/QObject.rb, line 256
def inspect
        "QObject of #{@link}(#{@obj_type} id:#{@my_id})"
end
is_custom?() click to toggle source
# File lib/FormHolder/Form/InputHolder/QBuilder/QObject.rb, line 98
def is_custom?
        return false if @custom.nil?
        @custom == "true"
end
last_field?() click to toggle source
# File lib/FormHolder/Form/InputHolder/QBuilder/QObject.rb, line 237
def last_field?
        last_field=nil
        @q.qobjects.reverse_each{|qobject|
                if qobject.obj_type == "f"
                        last_field = qobject
                        break
                end
        }
        last_field == self
end
set_obj_id(new_obj_id) click to toggle source
# File lib/FormHolder/Form/InputHolder/QBuilder/QObject.rb, line 191
def set_obj_id(new_obj_id)
        @obj_id=new_obj_id
        set_link_from_data
        store
end
set_text(new_text) click to toggle source
# File lib/FormHolder/Form/InputHolder/QBuilder/QObject.rb, line 248
def set_text(new_text)
        @widget.buffer.set_text(new_text)
end
store() click to toggle source
# File lib/FormHolder/Form/InputHolder/QBuilder/QObject.rb, line 197
def store
        edebug("storing(#{@my_id})","relation-builder")
        if is_custom?
                isql="`obj_id`='#{@obj_id}', `obj_type`='#{@obj_type}', `field`='#{escape_string(@field)}', `custom`='#{@custom}', `query_id`='#{@q.query_id}'"
        else
                isql=nil
                case @link.class.name
                        when "RField" then isql="`obj_id`='#{@obj_id}', `field`='#{@link.field_name}', `obj_type`='#{@obj_type}', `query_id`='#{@q.query_id}'"
                        when "RTable" then isql="`obj_id`='#{@obj_id}', `obj_type`='#{@obj_type}', `query_id`='#{@q.query_id}'"
                        when "Relation" then isql="`obj_id`='#{@obj_id}', `obj_type`='#{@obj_type}', `query_id`='#{@q.query_id}', `field`='#{"reverted" if @rel_reverted}'"
                        else edebug("don't store: #{link.class.name}","relation-builder",INFO)
                end
        end
        if isql
                if @my_id
                        sql="update `qobjects` set #{isql} where `id`='#{@my_id}'"
                        else
                        sql="insert into `qobjects` set #{isql}"
                end
                query(sql)
                @my_id=qrow("select id from `qobjects` order by id desc limit 1")["id"] unless @my_id
        end
end
text() click to toggle source
# File lib/FormHolder/Form/InputHolder/QBuilder/QObject.rb, line 252
def text
        @widget.buffer.text
end
to_s() click to toggle source
# File lib/FormHolder/Form/InputHolder/QBuilder/QObject.rb, line 260
def to_s
        inspect
end
update() click to toggle source
# File lib/FormHolder/Form/InputHolder/QBuilder/QObject.rb, line 184
def update
        @widget.buffer.set_text(gen_text)
end