2013-06-03 2 views
0

Я новичок в Ruby. Но из-за некоторой проблемы я должен обрабатывать код, так как наш рубиновый разработчик недоступен. Мы используем базу данных cassandra для получения значений из веб-службы Ruby (Sinatra) и помещаем ее в пространство ключей Cassandra. Но из-за какой-то проблемы данные не вставляются.Понимание скрипта Ruby для базы данных cassandra

В следующем коде partners_daily, partner_monthly и т. Д. Являются семейством столбцов (таблицы) в пространстве ключей статистики (базы данных).

if params and !partner_id.nil? and !activity_type.nil? 
      { 
       :partners_daily => "#{partner_id}_#{activity_type}_#{success == 1 ? 'sucess' : "failure:#{failure_code}"}_#{time.year}_#{time.month}_#{time.day}", 
       :partners_monthly => "#{partner_id}_#{activity_type}_#{success == 1 ? 'sucess' : "failure:#{failure_code}"}_#{time.year}_#{time.month}", 
       :partners_alltime => "#{partner_id}_#{activity_type}_#{success == 1 ? 'sucess' : "failure:#{failure_code}"}", 

       :channels_daily => "#{channel_id}_#{activity_type}_#{success == 1 ? 'sucess' : "failure:#{failure_code}"}_#{time.year}_#{time.month}_#{time.day}", 
       :channels_monthly => "#{channel_id}_#{activity_type}_#{success == 1 ? 'sucess' : "failure:#{failure_code}"}_#{time.year}_#{time.month}", 
       :channels_alltime => "#{channel_id}_#{activity_type}_#{success == 1 ? 'sucess' : "failure:#{failure_code}"}", 

       :countries_daily => "#{country}_#{activity_type}_#{success == 1 ? 'sucess' : "failure:#{failure_code}"}_#{time.year}_#{time.month}_#{time.day}", 
       :countries_monthly => "#{country}_#{activity_type}_#{success == 1 ? 'sucess' : "failure:#{failure_code}"}_#{time.year}_#{time.month}", 
       :countries_alltime => "#{country}_#{activity_type}_#{success == 1 ? 'sucess' : "failure:#{failure_code}"}" 
      }.each do |k,v| 
       stats.add(k, v, 1, 'count') 
      end 


      return "Activity stored in stats" 
     end 
    else 
     return "Error: client headers missing" 
    end 
end 

def count(table, key) 

    require 'cassandra-cql' # requiring this at the top was leading to error: unconfigured columnfamily 
    cqldb = CassandraCQL::Database.new('127.0.0.1:9160', {:keyspace => 'plystats'}) 

    query = "update partners_daily set count = ? where key = ?"#"update #{table} set count = count+1 where key = ?;" 

    #return cqldb.execute(query, 0, 'sonia').inspect 
    return query  

end 

Я хочу знать, как выполняется логика ввода данных в нем, и где? Это в stats.add(k, v, 1, 'count')?

и есть ли какие-либо ошибки во вставке, потому что это ошибка.

+0

не приходит без ошибки в сценарии, его только, что значения не будут вставлены в базу данных. Но когда я щелкнул правой кнопкой мыши по семейству столбцов и выделил 1000 строк, появится сообщение об ошибке: Null. –

+0

Да, я думаю .. но раскомментировать это не имеет значения. –

ответ

0

I want to know how the data inserting logic in it is being performed, and where ? Is it in stats.add(k, v, 1, 'count') ?

Да, это то, где это должно происходить. Между {} являются словарь/хеш-значения:

{ 
    :partners_daily => # … 
}.each do |k,v| 

Цикл запускается с помощью метода each, и каждая запись разлагают и введены в k и v, ключ в k и значение в v. Например, первая запись в хэш:

:partners_daily => "#{partner_id}_#{activity_type}_#{success == 1 ? 'sucess' : "failure:#{failure_code}"}_#{time.year}_#{time.month}_#{time.day}", 

Это затем разлагается внутри цикла each к:

k = :partners_daily 
v = # The result of 
    "#{partner_id}_#{activity_type}_#{success == 1 ? 'sucess' : "failure:#{failure_code}"}_#{time.year}_#{time.month}_#{time.day}", 

Я сейчас не то, что значения для partner_id и т.д., но делаю некоторые выглядят примерно как "123_sales_sucess_2013_6_01"

Обратите внимание, что там есть опечатка для слова success.

Это немного сбивает с толком из-за многочисленные двойные кавычки и скобки, так что я бы изменить это:

[partner_id, activity_type, (success == 1 ? 'success' : "failure:#{failure_code}"), time.year, time.month, time.day].join("_") 

Но обратите внимание, что есть много повторов там, так что я изменил бы все хэш (по крайней мере):

success_string = success == 1 ? 
        'success' : 
        "failure:#{failure_code}" 

data = { 
    :partners_daily => [partner_id, activity_type,success_string,time.year,time.month,time.day].join("_"), 
    :partners_monthly => [partner_id,activity_type,success_string,time.year,time.month].join("_"), 
    :partners_alltime => [partner_id,activity_type,success_string].join("_"), 

    :channels_daily => [channel_id,activity_type,success_string,time.year,time.month,time.day].join("_"), 
    :channels_monthly => [channel_id,activity_type,success_string,time.year,time.month].join("_"), 
    :channels_alltime => [channel_id,activity_type,success_string].join("_"), 

    :countries_daily => [country,activity_type,success_string,time.year,time.month,time.day].join("_"), 
    :countries_monthly => [country,activity_type,success_string,time.year,time.month].join("_"), 
    :countries_alltime => [country,activity_type,success_string].join("_") 
} 

data.each do |k,v| 
    # more code… 

Становится легче читать и видеть логику. Кроме того, помещая хеш в переменную data, вместо того, чтобы немедленно работать с ней, она позволяет вам более легко ее осматривать, например.

warn "data = #{data.inspect}" 

будет выводить представление данных в консоли, так что по крайней мере, вы могли бы получить представление о том, что сценарий пытается поставить в. В верхней части этого кода, можно также добавить warn "script = #{script.inspect}" проверить как выглядит объект script.

Если объект script является экземпляром Cassandra i.e.есть что-то вроде script = Cassandra.new "blah", "blahblah", который устанавливает его, то метод add является this one

Подпись дается это add(column_family, key, value, *columns_and_options), но это не похоже, чтобы соответствовать вызов у ​​вас есть:

stats.add(k, v, 1, 'count') 

должен (вероятно) быть:

stats.add('count', k, v, 1) 

на самом деле, я даже не уверен, что объединение в data хэш должно произойти, и, возможно, все это просто должно быть передано add, но это ваши данные, поэтому я не могу быть уверен.

Не стесняйтесь комментировать ниже, и я обновлю это.


Попытка его в IRB, чтобы проверить его на наличие ошибок синтаксиса:

success = 1 
# => 1 
partner_id = 123 
# => 123 
activity_type = "something" 
# => "something" 
time = Time.now 
# => 2013-06-05 11:17:50 0100 
channel_id = 456 
# => 456 
country = "UK" 
# => "UK" 
success_string = success == 1 ? 
        'success' : 
        "failure:#{failure_code}" 
# => "success" 

    data = { 
     :partners_daily => [partner_id, activity_type,success_string,time.year,time.month,time.day].join("_"), 
     :partners_monthly => [partner_id,activity_type,success_string,time.year,time.month].join("_"), 
     :partners_alltime => [partner_id,activity_type,success_string].join("_"), 

     :channels_daily => [channel_id,activity_type,success_string,time.year,time.month,time.day].join("_"), 
     :channels_monthly => [channel_id,activity_type,success_string,time.year,time.month].join("_"), 
     :channels_alltime => [channel_id,activity_type,success_string].join("_"), 

     :countries_daily => [country,activity_type,success_string,time.year,time.month,time.day].join("_"), 
     :countries_monthly => [country,activity_type,success_string,time.year,time.month].join("_"), 
     :countries_alltime => [country,activity_type,success_string].join("_") 
    } 
# => {:partners_daily=>"123_something_success_2013_6_5", :partners_monthly=>"123_something_success_2013_6", :partners_alltime=>"123_something_success", :channels_daily=>"456_something_success_2013_6_5", :channels_monthly=>"456_something_success_2013_6", :channels_alltime=>"456_something_success", :countries_daily=>"UK_something_success_2013_6_5", :countries_monthly=>"UK_something_success_2013_6", :countries_alltime=>"UK_something_success"} 
+0

Привет, я .. Большое спасибо. Это просто отличная помощь. Вы упростили для меня все хорошо. –

+0

Я думаю, что 'stats.add (k, v, 1, 'count')' останется таким, потому что у нас есть пространства ключей в db с тем же именем, что и partners_daily, partners_monthly ... и так далее. + –

+0

@RyanMalhotra Рад, что я мог бы помочь. – iain

Смежные вопросы