본문 바로가기

카테고리 없음

2022 오픈소스 컨트리뷰션 아카데미(갱신 중)

반응형

🍳 이전글

https://codecollector.tistory.com/1283

 

2021 오픈소스 컨트리뷰션 아카데미를 마치며

🍳이전글 https://codecollector.tistory.com/1098?category=1039078 2021 오픈소스 컨트리뷰션 아카데미 프로젝트 지원 후기  동기  여러 it기업을 지원하다 실패를 맛보고 하반기 준비를 하고 있을 때 좋은 기.

codecollector.tistory.com

🍳 머리글

컨트리뷰션 아카데미 2번째 시작

 


📕 변화

 

AST builder가 추가됐다. 활동이 뜬한 동안 폴더 구조를 비롯해 많은 부분이 바뀌었다.

나중에 maintainer분들에게 설명을 들었다. 우리 프로젝트는 schema가 없어도 임베디드나 웹 하드웨어에 접목해 사용할 수 있도록 하는 것이 목적이라고 한다. 이에 맞춰 추가 기능을 구현할 예정이다.

 

폴더구조는 다음과 같다.

execution - 문자열 sql문 parsing 후 ast생성함 이는 sqlparser open source module을 사용하고 있음. 덕분에 쉽게 sql문을 parsing하고 ast를 구축할 수 있게 됨.


traslate layer - sqlparser에 의존성이 있으며 이걸 쓰는데 이를 통해 나온 ast는 너무 많은 정보가 있음. 그 중 GlueSQL에서 필요한 것만 추려내는 작업을 함. 필요한 sqlparser module의 내장 parser함수로 enum을 얻고 이를 GlueSQL에서 인식 가능한 enum으로 wrapping해주는 함수들이 구현되어 있음. 이를 통해 추려진 ast가 나옴


store - 무엇을 읽고 쓸건지 interface 정의부


plan - index, join 어떻게 할지 에 대한 부분. 없어도 실행은 가능하지만 더 효율적 실행을 위해 있음

query builder가 이번년도 메인 컨텐츠라고 한다.
기존 query builder는 함수로 sql만들기
gluesql은 sql뿐만 아니라 sqlparser module을 통해 ast도  만들어 줌. 덕분에 sql문을 바로 실행가능하게 해줌

기존에 다른 query builder들은 파서가 없어 형식제약이 있었음. 


gluesql은 이미 파서가 있어서 다양하게 인자를 넘겨서 함수를 쓸 수 있음
순서대로 실행할 수 있도록 함. 기존에는 코드상에서 절차대로 수행되는 것이나닌 plan에 따라 실행순서가 달라질 수 있었음.

 

이후 chaining function에 대해 바로 실행가능한 execution이 만들어지면서 다양한 test가 가능하게 되었다.


📕 활동

공식적인 활동을 시작하기 이전부터 디스코드 채널에서 꾸준히 교류를 진행했고 코로나로 인한 인원제한에 자유로워지면서 오프라인 모각코도 매주 1회 진행하기 시작했다. 학습환경이 없으면 집중이 떨어지는 것에 동의한 처사였다. 모여서 꼭 PR을 해내겠다는 신념으로 진행했다.

📔 공식 활동 전

📑 기능 추가

2022.06.06 Aggregate function VARIANCE

 

Support `VARIANCE` aggregate function & update aggregate test by zmrdltl · Pull Request #598 · gluesql/gluesql

1. Add VARIANCE aggregation function ref) https://www.ibm.com/docs/ko/db2/11.1?topic=functions-variance VARIANCE = SUM(expression**2)/COUNT(expression) - (SUM(expression)/COUNT(expression))**2 The ...

github.com

분산함수를 추가했다. 분산은 다음과 같은 공식으로 계산된다.

VARIANCE = SUM(expression**2)/COUNT(expression) - (SUM(expression)/COUNT(expression))**2

 

그대로 구현해 간편하게 commit 개수를 늘릴 욕심에 설렜었던 것을 반성한다. 이대로 구현시 나눗셈 연산이 두 번 들어가게 되어 rust에서 정한 epsilon크기를 넘게 된다. 이는 상대오차에 의해 floor의 결과값을 비교하는 test 실패가 뜨는 현상이 생겼다. 때문에 나눗셈 연산을 한 번만 하도록 공식을 수정해 계산해야 했다. 그럼 그렇지. 자 야크 털을 깎도록 하자

 

변형과정은 다음과 같다.

1. 식을 단순화한다

V = S1 / C - (S2 / C) ^ 2

2. 양항에 C^2를 곱한다

V*(C^2) = S1*C - S2^2

3. 다시 치환해본다. S1*C - S2^2는 어떤 값 T라고 생각할 수 있다. 따라서 다음처럼 된다.

V*(C^2) = T

4. 양항을 C^2로 나눈다.

V = T / (C^2)

이렇게 한 번만 나눠서 분산을 구해 오차 미만으로 test를 통과할 수 있었다.

 

구현하다가 Sum함수에서 add value하는 부분에 unwrap()을 발견했다. 처음에는 이게 무엇이 문제인지 몰랐으나 고수분께서 설명해주셨다. error발생시 처리되지 않은 unwrap부분에서 panic이 날 수 있기 때문에 좋지 않다는 것이었다. 역시 오프라인 모각코는 많은 배움을 받을 수 있다.

 

 

📔 Challenges (22. 7. 9. - 22. 8. 10)

📑 기능 추가

2022.07.11 [AST builder] Add aggregate functions

 

feat(ast_builder): Add Agggregate functions by zmrdltl · Pull Request #635 · gluesql/gluesql

resolve #634 Tasks count => will do later PR : avg : min : variance

github.com

기존 sum, max만 구현되어 있었던 ast_builder/aggregate.rs에서 min, avg, variance를 추가했다. ExprNode가 자유롭게 확장될 수 있는 형태였기에 간편히 추가할 수 있었다. 하지만 count의 경우 ExprNode가 가지고 있지 않은 wildcard로 변환을 해야하는 CountArgExpr enum형태여서 따로 PR을 나누게 되었다.

 

2022.07.17 [AST Builder] Implement Agggregate function COUNT

 

count를 제외한 나머지 함수들은 AggregateNode -> ExprNode -> Expr를 from함수로 자유롭게 형변환이 가능했다. count의 경우 Count(CountArgExpr)형태였기에 AggregateNode -> CountArgExpr -> Expr또는 Wildcard로 변환을 해야하는 상황이었다. 구현된 구조 중간에 다른 형태로 형변환을 거쳐야 되는 구조수정 문제였다. 새로운 enum인 CountArgExprNode를  select_item_list.rs를 참고해 해결했다. 결론적으로 AggregateNode -> CountArgExprNode -> CountArgExpr형태가 되었다. CountArgExprNode는 Text 또는 Expr로 구성되어 있어 sql문에서 "*"인 경우 Text를 통해 바로  CountArgExpr::Wildcard 형변환이 가능해졌다. Expr인 경우 문자열을 바로 parsing할 수 있는 sqlparser 내장함수인 parse_expr로 Expr를 얻은 후 GlueSQL이 지원하는 형태의 Expr로 치환하는 translate_expr함수를 수행하게 되며 이로써 CountArgExpr::Expr(Expr)형태로 변환된다. 

 

📑 기능 추가 및 변경

2022.07.24 [Data] Add function sqrt for enum Value

 

[Data] Add function `sqrt` for enum `Value` by zmrdltl · Pull Request #675 · gluesql/gluesql

Description Implement to support evaluating sqrt between enum Value https://doc.rust-lang.org/std/primitive.f64.html For real numbers less than or equal to 0, std::f64::sqrt() returns NaN. Therefo...

github.com

enum Value 사이 sprt함수 지원이 구현되어 있지않아 기능을 추가했다. 또한 f64이외 I8, I16: I32, I64에 대해 sqrt를 구현할 경우 error를 발생시키는데 이를 모두 f64로 casting 후 sqrt함수의 결과값을 반환하는 함수를 구현에 추가했다. 이후 string이나 object, list, timestamp에 대해 sqrt함수를 적용할 경우 error 처리를 unit test로 구현했으며 어떤 type인지 출력하도록 객체정보를 추가했다. 기존에 Function부분에서 사용했던 sqrt함수가 별도로 정의되어 있었는데 이는 Function에서 parsing한 value type이 f64인것에 대해서만 지원했었다. 새롭게 구현된 sqrt함수로 정수형도 받을 수 있도록 기능이 개선되게 되었다.

 

📑 기능 추가 

2022.07.30 Add STDEV aggregate function

 

Add `STDEV` aggregate funtion by zmrdltl · Pull Request #684 · gluesql/gluesql

resolved : #609 Added STDEV function to ast_builder and executor.

github.com

분산함수를 구현한 후 표준편차를 새롭게 구현했다. 분산의 제곱근이 표준편차이므로 만든 sqrt함수로 간단히 추가할 수 있었다.

📑 구조 변경

Update Aggregate Function

기존 AggregateNode -> Expr로 바로 type변환을 하는 구조에서 중간 type인 Aggregate를 skip하는 형태라 이를 수정했다. AggregateNode- > Aggregate -> Expr로 변환이 되었다.

📑 구조 변경

2022.08.06 Update FunctionNode structure

 

[AST Builder] Update FunctionNode structure by zmrdltl · Pull Request #723 · gluesql/gluesql

Description Fixed structure for uniform cast in ast_builder. Instead of being converted to Expr directly at each node, conversion is performed to the correct enum type in the intermediate stage.

github.com

마찬가지로 ast builder내 type 변환에 통일성을 위해 구조를 수정했다. 기존 FunctionNode -> Expr에서 FunctionNode -> Function -> Expr형태로 type 변환이 어뤄지게 된다.

📑 구조 변경

2022.08.28 Update aggregate functions to support Expr

 

aggregate 함수에 들어올 수 있는 인자가 3종류뿐이었는데 이를 expr로 대체함으로써 모든 수식이 들어갈 수 있게 되었다.

이를 위해서는 evaluate함수를 이용했어야 했는데 인자로 stroage가 필요하게 되었다. 이는 I/O가 발생하므로 async await이 필요하게 되었고 때문에 기존에 사용하던 lifetime이 꼬이게 되었다. 이를 해결하기 위해 부득이하게 indentation depth가 늘어나게 되었고 해석하기 힘든 code로  구성되어 있는데 이를 해결하기 위해서는 고민이 필요해 보인다. 그리고 불필요한 blend와 filter context를 번갈아 사용하게 되는데 이를 하나로 합치는 작업을 수행하고 group by having 절을 검사해 계산하는 부분을 함수로 빼냈다.

📑 구조 변경

2022.09.04 [Test Suite] Refacting tests

 

[Test Suite] Refacting tests · Issue #782 · gluesql/gluesql

Description refacting some tests in folder test_suite Tests implemented in the existing test suite have become longer as new functions are added. To do this, we need to split the test file by funct...

github.com

 

여러 기능들이 추가됨에 따라 test code의 형식과 사용 함수들에 대한 정리가 필요해졌다. 각 test 함수의 인자 서순의 통일과 file 정리를 진행했다.

📑 기능 추가

22.09.12 [Data] add data type u8

 

[Data] add data type u8 by zmrdltl · Pull Request #828 · gluesql/gluesql

Background from #623 ref About numeric type mysql oracle postgresql overflow handling mysql oracle question Description When calculating arithmetic operations on u8 and i8, both are converted ...

github.com

unsigned int type에 대해서 추가함. 이후 numeric 관련 casting에 대해 test code를 작성.

 

📑 구조 변경

22.09.15 [Data] update some of numeric data type to custom data type

 

[Data] update some of `numeric data type` · Issue #845 · gluesql/gluesql

Description we use sqlparser-rs becasue of 2 reasons parse sql statement make AST parsed sql's ast result looks like this e.g1 SQL CREATE TABLE Item ( field_one INT(8), field_two INTEGER(8), );...

github.com

sqlparser가 제공하는 custom type을 이용해 INT(8)형식으로 sql문에서 column의 data type을 정의하던 것을 INT8 형식으로 정의할 수 있도록 수정했습니다.

 

📑 기능 추가

22.10.02 ~ 22.10.03 Implement function POSITION 

 

Implement function `POSITION` by zmrdltl · Pull Request #862 · gluesql/gluesql

Background resolve #855 Tasks add structures ast translate executor plan ast_builder add tests projection with columns only string errors

github.com

문자열에서 부분 문자열이 나온다면 해당 index를 반환해주는 position함수를 추가함. 못찾을 경우 0, 찾았으면 1이상의 값을 반환하며 Null인 경우 NULL을 반환하기 위해 자체적으로 Value를 반환하도록 str_position함수를 추가했다. 상위로 position 함수를 구현했는데 이는 Value에 String을 사용하는 Map이나 List에 대한 구현시 확정성을 고려했기 때문이다.


*더 나은 내용을 위한 지적, 조언은 언제나 환영합니다.