Fast Query

class System::FastQuery
  def self.sub_join_str(model)
    Util.is_submodel(model) ? " AND #{model.table_name}.#{model.inheritance_column} = '#{model.name.demodulize}'" : ""
  end
  class Conditions
    attr_reader :conditions
    def initialize(model)
      @model = model
      @conditions={}
    end

    def method_missing(method_id)
      name = method_id.id2name
      condition = Condition.new(@model,name.to_sym)
      @conditions[name] = condition
      condition
    end
  end
  
  class Relation
    def initialize(parent_model,child_model,belongs_to=false)
      @parent_model = parent_model
      @child_model = child_model
      @join_model = belongs_to ? parent_model : child_model
      @block_conditions = Conditions.new(@join_model)
      @foreign_key = parent_model.class_name.underscore + '_id'
      @model = Model.new(@join_model)
      @conditions = {}
    end
    
    def model
      @model
    end
    
    def and_conditions(conditions)
      @conditions = conditions
      self
    end
    
    def should()
      yield(@block_conditions)
    end
    
    def through(key)
      @foreign_key = key.to_s
      self
    end
    
    def join_str
      join_type = model.is_nil ? "LEFT JOIN" : "JOIN" 

      join = " #{join_type} #{@join_model.table_name} ON #{@parent_model.table_name}.id = #{@child_model.table_name}.#{@foreign_key} "
      join << System::FastQuery.sub_join_str(@child_model)
      join << System::FastQuery.sub_join_str(@parent_model)
      
      @conditions.each do |k,v|
        join << " AND #{@join_model.table_name}.#{k} = #{Util.get_value(v)}" 
      end
      
      @block_conditions.conditions.each do |k,v|
        join << v.to_s
      end
      join
    end
  end
  
  class Model
    attr_reader :is_nil
    attr_reader :table_name
    attr_reader :relations
    attr_reader :model
    attr_reader :conditions
    def initialize(model)
      @model,@table_name = model, model.table_name
      @relations = {}
      @is_nil = false
      @conditions = []
    end
    
    def have(child_model)
      unless @relations.has_key? child_model
        relation = Relation.new(@model,child_model)
        @relations[child_model] = relation
        instance_eval("def #{child_model.name.demodulize.underscore}\n @relations[#{child_model}].model() \n end")
      end
      @relations[child_model]
    end
    
    def belongs_to(parent_model)
      unless @relations.has_key? parent_model
        relation = Relation.new(parent_model,@model,true)
        @relations[parent_model] = relation
        instance_eval("def #{parent_model.name.demodulize.underscore}\n @relations[#{parent_model}].model() \n end")
      end
      @relations[parent_model]      
    end
    
    def should(attr)
      operator = @conditions.empty? ? :NIL : :AND
      create_condition(attr,operator)
    end
    
    def and(attr)
      raise 1 if @conditions.empty?
      create_condition(attr,:AND)
    end
    
    def or(attr)
      raise 1 if @conditions.empty?
      create_condition(attr,:OR)
    end

    def nil
      @is_nil = true
      self.should(:id).nil
    end
    
    def find_all(query_model = @model,&block)
      self.find({:type=>:all,:model=>query_model},&block)
    end
    
    def find_first(query_model = @model,&block)
      self.find({:type=>:first,:model=>query_model},&block)
    end
    
    def find(options={},&block)
      query_model = options[:model] || @model
      type = options[:type] || :all
      
      sql = generate_sql(query_model,type)
      
      all = query_model.find_by_sql(sql)
      if block
        all.find_all(&block)
      end
      if type == :first
        all.empty? ? nil : all[0]
      else
        all
      end
    end
    
    def order_by(order)
      @order_by = " ORDER BY #{order}"
    end    
    
    def generate_sql(query_model=@model,type=:all)
      table = query_model.table_name
      sql = "SELECT DISTINCT #{table}.* FROM #{@model.table_name}"
      conditions,joins = " WHERE 1=1 ",""
      generate_joins(joins,self)
      generate_conditions(conditions,self)
      sql << joins << conditions
      sql << @order_by if @order_by
      sql << " LIMIT 1 " if type == :first
      sql
    end

    private
    def create_condition(attr,operator)
      condition = Condition.new(self,attr,operator)
      @conditions << condition
      condition      
    end

    def generate_joins(joins,model)
      model.relations.each do |k,v|
        joins << v.join_str
        generate_joins(joins,v.model)
      end
    end   
    
    def generate_conditions(conditions,model)
      conditions << ' AND (' unless model.conditions.empty?
      model.conditions.each_with_index do |c,i|
        conditions << c.to_s
      end
      #      conditions << System::FastQuery.sub_join_str(model.model)
      conditions << ") " unless model.conditions.empty?
      
      model.relations.each do |k,v|
        generate_conditions(conditions,v.model)
      end
    end
  end
  
  class Condition
    def initialize(model,attr,operator=:AND)
      @model = model
      @table_name = model.table_name
      @attr = attr
      @operator = operator
    end
    
    def equal(value)
      internal_compare('=',value)
      @model
    end
    
    def not_equal(value)
      internal_compare('<>',value)
      @model
    end
    
    def between(range)
      @str = " #{@table_name}.#{@attr.to_s} BETWEEN #{Util.get_value(range.begin)} AND #{Util.get_value(range.end)} "
      @model    
    end
    
    def ==(value)
      self.equal(value)
    end
    
    def <(value)
      internal_compare('<',value)
    end    
 
    def <=(value)
      internal_compare('<=',value)
    end
    
    def >(value)
      internal_compare('>',value)
    end
    
    def >=(value)
      internal_compare('>=',value)
    end
    
    def like(value)
      @str = " #{@table_name}.#{@attr.to_s} like '%#{value}%' "
      @model
    end
    
    def in(value)
      internal_in(value,"IN")
    end
    
    def not_in(value)
      internal_in(value,"NOT IN")
    end    
    
    def nil
      @str = " #{@table_name}.#{@attr.to_s} IS NULL "
      @model
    end
    
    def to_s
      operator = (@operator==:NIL) ? ' ' : " #{@operator.to_s} "
      operator + @str
    end   
    
    private
    def internal_in(value,type)
      if value.empty?
        if type == "IN"
          @str = " 1=0 " 
        else
          @str = " 1=1 "
        end
      else
        @str = " #{@table_name}.#{@attr.to_s} #{type} ("
        @str << value.collect{|v| Util.get_value(v)}.join(',') << ') '
      end
      @model
    end
    
    def internal_compare(operator,value)
      @str = " #{@table_name}.#{@attr.to_s} #{operator} #{Util.get_value(value)} "
      @model
    end
  end  
end

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园的建设目标是通过数据整合、全面共享,实现校园内教学、科研、管理、服务流程的数字化、信息化、智能化和多媒体化,以提高资源利用率和管理效率,确保校园安全。 智慧校园的建设思路包括构建统一支撑平台、建立完善管理体系、大数据辅助决策和建设校园智慧环境。通过云架构的数据中心与智慧的学习、办公环境,实现日常教学活动、资源建设情况、学业水平情况的全面统计和分析,为决策提供辅助。此外,智慧校园还涵盖了多媒体教学、智慧录播、电子图书馆、VR教室等多种教学模式,以及校园网络、智慧班牌、校园广播等教务管理功能,旨在提升教学品质和管理水平。 智慧校园的详细方案设计进一步细化了教学、教务、安防和运维等多个方面的应用。例如,在智慧教学领域,通过多媒体教学、智慧录播、电子图书馆等技术,实现教学资源的共享和教学模式的创新。在智慧教务方面,校园网络、考场监控、智慧班牌等系统为校园管理提供了便捷和高效。智慧安防系统包括视频监控、一键报警、阳光厨房等,确保校园安全。智慧运维则通过综合管理平台、设备管理、能效管理和资产管理,实现校园设施的智能化管理。 智慧校园的优势和价值体现在个性化互动的智慧教学、协同高效的校园管理、无处不在的校园学习、全面感知的校园环境和轻松便捷的校园生活等方面。通过智慧校园的建设,可以促进教育资源的均衡化,提高教育质量和管理效率,同时保障校园安全和提升师生的学习体验。 总之,智慧校园解决方案通过整合现代信息技术,如云计算、大数据、物联网和人工智能,为教育行业带来了革命性的变革。它不仅提高了教育的质量和效率,还为师生创造了一个更加安全、便捷和富有智慧的学习与生活环境。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值