어제 개발하고 뭔가 아쉬움을 느꼈다. ( http://tost.tistory.com/176 )

왜냐... 몽고DB에서 json데이터를 집어 넣는데...
이때의 필드명이 map의 key값과 매칭되는데
다른 이름으로 쓰고 싶다는것이다. 흠흠

근데 내가 구현한 어제 코드에서는 그룹핑된 hash의 key값이 고정적이라는것이다.
예를들어,   "sum(field)" => "value" 의  sum(field)  같이 말이지

그래서 sql의 as 같은 닉네임과,
손보는김에 where절을 블럭으로 구현해서 쓰도록 했다..


 뭔소린지 모르겠으니, sql문과 비교해보면 이런느낌...

 sql문 내가 만든 코드와 비교하면 
 select
   max(size) as max_size,
   max(size) ,
   sum(size) ,
   count(key) ,
   min(size)

from
  table
where
   filedate.substr(1,4) = '2011'
group by
   filedate.substr(1,4)
 
 


 
# count, sum, max, min, first 라는 기능은 구현해놨다.
 table = { "size" => "20" ... 생략 ... }

 obj = GroupHash.new
 obj.set_field("max(size) as max_size, max(size),sum(size),count(key), min(size)")
 obj.addAll( table 

 obj.where do
   map["filedate"].slice(0,4)   == "2011" 
 end


 result = obj.group { |map| 
  map["filedate"].slice(0,4)
 }


puts result 






기능추가한 새버전을 보세요 ==> 
http://tost.tistory.com/177 





보통 데이터에서 그룹핑을 하는건 DB에서 자주 쓰인다.

근데, db를 안쓰고도 자료형의 값을 할 수 있는 유틸을 만들어야 하는 상황이 왔다.
루비를 접한지 2주밖에 안되서 좀 미루다가... 오늘 책도 정독하고 고민하면서
이틀을 고민해서 만들었는데 생각보다 편하게 잘 나온거 같다.

아무튼 루비에서 Hash타입이라면 범용적으로 쓸 수 있게 구현했다. (코드를 보면 알 듯)

sql문이랑 비교하는 글쓰다보니 손봐서 where절처럼 필터링하는것도 추가하면 괜찮을듯하다
사실 add, addAll 할 때  걸러내는건 쉽게 구현이 될테니 skip 했는데... 
뭐 귀찮으니 필요하면 그 때 만들자. 



 sql문 내가 만든 코드와 비교하면 
 select
   max(size) ,
   max(size) ,
   sum(size) ,
   count(key) ,
   min(size)

from
  table
group by
   filedate.substr(1,4)
 
 
# count, sum, max, min, first 라는 기능은 구현해놨다.
 table = { "size" => "20" ... 생략 ... }

 obj = GroupHash.new
 obj.set_field("max(size), max(size),sum(size),count(key), min(size)")
 obj.addAll( table

 result = obj.group { |map| 
  map["filedate"].slice(0,4)
 }

puts result 


뭐 이런것이랄까요 ?
DB의 내장함수인 max, sum, count, min 같은것도 및에 소스코드를 보면 알겠지만 함수명과 매칭된다.
혹시 추가적으로 기능을 추가하고 싶다면 쉽게 추가할 수 있다.
동적으로 호출하기 때문에 함수기능만 추가하고, set_field에 세팅할때 쿼리에 추가만 하면된다.







루비의 정규식을 테스트할 수 있는 홈페이지가 있다.
http://rubular.com/

기냥 sql문에서 "sum(값)" 에서 "값"만 뽑아내고 싶었는데... (=즉, Match Groups)
어떻게 뽑는지 애매..하다.

[소스코드]
fileRex = "sum[(]([a-zA-Z_]+[a-zA-Z0-9_-]*)[)]"
str     = "sum(test)    ,sum(1Test), count(d33), sum(file), count(te2t), max(xxxx), sum(_sum) , sum(d434_d-)"

str.scan(Regexp.new(fileRex)).flatten.map {|n|
  puts "field : " + n 
}

[결과]
field : test
field : file
field : _sum
field : d434_d-


간단히, 해당되는게 포함되었는지 유무만 체크할땐
if Regexp.new(fileRex) =~ str
  puts "yes"
else
  puts "no"
end


match result값은... 지금 필요없어서 안알아봤다..ㅋ



* 참고URL : http://ruby.about.com/od/regularexpressions/a/regexgrouping.htm

+ Recent posts