Monday, 24 July 2017

IMport with Redis Server:

namespace :import_db_to_redis do
  desc "Import API's data to REDIS"
  task import: :environment do

    @api_url = []

    for n in 0..1075
      @api_url << "https://data.gov.in/api/datastore/resource.json?resource_id=cb579e8f-e4e0-48eb-a058-1fc812a38ff2&api-key=ae0612afc91e5595f4806c0a93ed7e0f&offset=#{n}"
    end

    for n in 0..294
      @api_url << "https://data.gov.in/api/datastore/resource.json?resource_id=03a4f696-d003-4a06-ae85-0116b1c94d2e&api-key=ae0612afc91e5595f4806c0a93ed7e0f&offset=#{n}"
    end

    for n in 0..167
      @api_url << "https://data.gov.in/api/datastore/resource.json?resource_id=134fa677-4fa1-427b-9608-a0c226339ae2&api-key=ae0612afc91e5595f4806c0a93ed7e0f&offset=#{n}"
    end

    for n in 0..16
      @api_url << "https://data.gov.in/api/datastore/resource.json?resource_id=4fc1510b-883a-419a-9cf2-efc3221bdada&api-key=ae0612afc91e5595f4806c0a93ed7e0f&offset=#{n}"
    end

    for n in 0..444
      @api_url << "https://data.gov.in/api/datastore/resource.json?resource_id=189cab67-c7fa-4e58-995c-fb467434169d&api-key=ae0612afc91e5595f4806c0a93ed7e0f&offset=#{n}"
    end
  
    @api_url << "https://data.gov.in/api/datastore/resource.json?resource_id=0ee2ec3f-c1a2-4008-87de-ef5ece8adb9d&api-key=ae0612afc91e5595f4806c0a93ed7e0f"
  
    puts @api_url.uniq.count

    @api_url.each do |url|
        data=Nokogiri::HTML(open(url))
        @records = JSON.parse(data)["records"]  
        @dists = {}      
        @sub_dists = {}      
        @cities = {}      
      set_json_data    
        import_data
      end

      puts "Done!"
  end
  def set_json_data

    @records.group_by { |d| d["STATENAME"]}.each do |st_key, st_value|    
      puts "Collecting #{st_key} state records..."
      st_value.group_by { |d| d["DISTRICTNAME"]}.each do |key, value|
        puts "Collecting #{key} district records..."
        value.group_by { |d| d["SUBDISTRICTNAME"]}.each do |key1, value1|
          puts "Collecting #{key1} sub-district records..."
          @cities_array = []
          value1.each do |k,v|
            @cities_array << k["AreaName"]
          end
          @cities[key1] = @cities_array.uniq
        end

        @sub_dists_array = []
        value.each do |k,v|      
          @sub_dists_array << k["SUBDISTRICTNAME"]
        end
        @sub_dists[key] = @sub_dists_array.uniq      
      end
      @dists_array = []
      st_value.each do |st_k,st_v|
        @dists_array << st_k["DISTRICTNAME"]
      end
      @dists[st_key] = @dists_array.uniq    
    end
  end

  def import_data
    redis = REDIS.hgetall('State')  
    st = redis["Name"].present? ? JSON.parse(redis["Name"]) : []
    state = st.push(@records.first["STATENAME"]).uniq.sort
    dis = redis["Dist"].present? ? JSON.parse(redis["Dist"]) : {}
    dist = dis.merge(@dists)
    sub_dis = redis["SubDist"].present? ? JSON.parse(redis["SubDist"]) : {}
    sub_dists = sub_dis.merge(@sub_dists)
    ct = redis["City"].present? ? JSON.parse(redis["City"]) : {}
    cities = ct.merge(@cities)
  
    puts "Importing states records..."
    REDIS.mapped_hmset 'State', "Name" =>    state.to_json
    puts "Importing districts records..."
    REDIS.mapped_hmset 'State', "Dist" =>    dist.to_json
    puts "Importing sub-district records..."
    REDIS.mapped_hmset 'State', "SubDist" => sub_dists.to_json
    puts "Importing cities records..."
    REDIS.mapped_hmset 'State', "City" =>    cities.to_json
  end

end

No comments:

Post a Comment