paust-team / paust-db

GNU General Public License v3.0
6 stars 5 forks source link

Change meta/real data query response's JSON structure #41

Closed dragon0170 closed 5 years ago

dragon0170 commented 5 years ago

ABCI query response value 구조 변경

metadata, realdata에 대한 query의 response value에 id를 추가하고 timestamp, metadata, realdata를 구분하여 출력하도록 변경.

AS IS

[
    {"timestamp":1546507007394725000,"userKey":"Pe8PPI4Mq7kJIjDJjffoTl6s5EezGQSyIcu5Y2KYDaE=","qualifier":"test","data":"YWJj"},
    {"timestamp":1546507024832737000,"userKey":"UQPTpLQUifnKY0+QvHHkDey51qOou4YVKbENtCraiQ4=","qualifier":"test","data":"YWJj"}
]

TO BE

{
    "timestamp": [
        {"id":"FXZLldufQtA97w88jgyruQkiMMmN9+hOXqzkR7MZBLIhy7ljYpgNoXRlc3QAAAAAAAAAAAAAAAAAAAAA", "value":1546507007394725000},
        {"id":"FXZLxXJgQ8BRA9OktBSJ+cpjT5C8ceQN7LnWo6i7hhUpsQ20KtqJDnRlc3QAAAAAAAAAAAAAAAAAAAAA", "value":1546507024832737000}
    ],
    "meta": [
        {"id":"FXZLldufQtA97w88jgyruQkiMMmN9+hOXqzkR7MZBLIhy7ljYpgNoXRlc3QAAAAAAAAAAAAAAAAAAAAA", "userKey":"Pe8PPI4Mq7kJIjDJjffoTl6s5EezGQSyIcu5Y2KYDaE=", "qualifier":"test"}, 
        {"id":"FXZLxXJgQ8BRA9OktBSJ+cpjT5C8ceQN7LnWo6i7hhUpsQ20KtqJDnRlc3QAAAAAAAAAAAAAAAAAAAAA", "userKey":"UQPTpLQUifnKY0+QvHHkDey51qOou4YVKbENtCraiQ4=", "qualifier":"test"}
    ],
    "data": [
        {"id":"FXZLldufQtA97w88jgyruQkiMMmN9+hOXqzkR7MZBLIhy7ljYpgNoXRlc3QAAAAAAAAAAAAAAAAAAAAA", "value":"YWJj"}, 
        {"id":"FXZLxXJgQ8BRA9OktBSJ+cpjT5C8ceQN7LnWo6i7hhUpsQ20KtqJDnRlc3QAAAAAAAAAAAAAAAAAAAAA", "value":"YWJj"}
    ]
}
kwjooo commented 5 years ago

type으로 되어있는 부분 qualifier로 수정해주세요~

dragon0170 commented 5 years ago

https://github.com/paust-team/paust-db/issues/41#issuecomment-451831754 수정 완료.

dragon0170 commented 5 years ago

아래와 같은 struct type을 추가하여 사용하면 될 듯.

type TimestampStruct struct {
    Id    []byte `json:"id"`
    Value int64  `json:"value"`
}

type MetaStruct struct {
    Id        []byte `json:"id"`
    UserKey   []byte `json:"userKey"`
    Qualifier string `json:"qualifier"`
}

type DataStruct struct {
    Id    []byte `json:"id"`
    Value []byte  `json:"value"`
}

type MetadataResponse struct {
    Timestamp []TimestampStruct `json:"timestamp"`
    Meta      []MetaStruct      `json:"meta"`
}

type RealdataResponse struct {
    Timestamp []TimestampStruct `json:"timestamp"`
    Meta      []MetaStruct      `json:"meta"`
    Data      []DataStruct      `json:"data"`
}
code-to-gold commented 5 years ago

이거 적용 일정이 어떻게 될까요?

kwjooo commented 5 years ago

이거 오늘 적용가능합니다

kwjooo commented 5 years ago

https://github.com/paust-team/paust-db/issues/41#issuecomment-451868964 TimestampStruct value 부분 int64 -> uint64로 수정해서 사용합니다 DataStruct -> RealDataStruct로 수정해서 사용해도 괜찮겠죠 @dragon0170

kwjooo commented 5 years ago

@dragon0170 @code-to-gold @elon0823 RealDataStruct라는 이름의 struct가 추가되면서 기존 RealData라는 이름의 struct와 혼동이 있는데, 기존 RealData struct이름을 RealDataReq로 수정하면 어떨까요? 참고로 기존 RealData라는 이름의 struct는 오로지 write request시에 만 사용됩니다.

code-to-gold commented 5 years ago

잠시만요 그전에 response 구조가 저렇게 되기로 했었나요? timestamp까지 저렇게 하는건 아닌것 같은데...

code-to-gold commented 5 years ago

@dragon0170 저번에 찍은 사진 있어요?

code-to-gold commented 5 years ago

@co1god 이거 meta, data 만 구분하고, timestamp는 안으로 들어가야 하지 않을까요?

elon0823 commented 5 years ago

https://github.com/paust-team/paust-db/issues/41#issuecomment-454261572 struct 관련한 request, response 주고받는 오브젝트들을 Obj, Item 같은 접미사로 통일 시키고 Read/Write 에 대한 것인지에도 구분할 수 있도록 네이밍을 하는 것에 대한 이슈 작성이 필요해보입니다.

1dennispark commented 5 years ago

@code-to-gold 음... TimestampStruct가 밖에 빠져나와있는건 좋은데 timestamp를 위한 값이 아니라 Key를 위한 값입니다.

제 생각에 KeyStruct를 만들고 그 안에 Timestamp를 정의하구요. Meta, Data => 안에 KeyStruct를 공통으로 가지고 있으면 좋을것같습니다.

그리고 저기 위에 JSON으로 정의한것은 그냥... 콘솔에서 보여주기위한 용도니까 크게 신경 안쓰셔도 됩니다.

dragon0170 commented 5 years ago

1/16 논의 후 바뀐 구조에 따라 types.go 파일 내의 type을 바꿔보았습니다.

type WRealDataObjs []WRealDataObj

type MetaDataObj struct { UserKey []byte json:"userKey" Qualifier []byte json:"qualifier" }

type KeyObj struct { Timestamp uint64 json:"timestamp" }

type RowKey []byte type RowKeys []RowKey

type RMetaDataQueryObj struct { Start uint64 json:"start" End uint64 json:"end" }

type RRealDataQueryObj struct { Keys RowKeys json:"keys" }

type RMetaDataResObj struct { Key RowKey json:"key" UserKey []byte json:"userKey" Qualifier []byte json:"qualifier" }

type RMetaDataResObjs []RMetaDataResObj

type RRealDataResObj struct { Key RowKey json:"key" Data []byte json:"data" }

type RRealDataResObjs []RRealDataResObj


바뀐 metadata/realdata query의 JSON object 예시는 아래와 같습니다.
```json
# RMetaDataQueryObj
{
    "start":1546507007394725000,
    "end":1546507024832737000
}

# RMetaDataResObj
[
    {"key":"eyJ0aW1lc3RhbXAiOjE1NDY1MDcwMDczOTQ3MjUwMDB9", "userKey":"Pe8PPI4Mq7kJIjDJjffoTl6s5EezGQSyIcu5Y2KYDaE=", "qualifier": "LCBleGNlZWRzIHRoZSBzaG9ydC"},
    {"key":"eyJ0aW1lc3RhbXAiOjE1NDY1MDcwMDc1OTQ3MjUwMDB9", "userKey":"UQPTpLQUifnKY0+QvHHkDey51qOou4YVKbENtCraiQ4=", "qualifier": "TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5"},
    {"key":"eyJ0aW1lc3RhbXAiOjE1NDY1MDcwMTczOTQ3NDgwMDB9", "userKey":"UQPTpLQUifnKY0+QvHHkDey51qOou4YVKbENtCraiQ4=", "qualifier": "LCBleGNlZWRzIHRoZSBzaG9ydC"}
]

# RRealDataQueryObj
{
    "keys":[
        "eyJ0aW1lc3RhbXAiOjE1NDY1MDcwMDczOTQ3MjUwMDB9",
        "eyJ0aW1lc3RhbXAiOjE1NDY1MDcwMTczOTQ3NDgwMDB9"
    ]
}

# RRealDataResObj
[
    {"key":"eyJ0aW1lc3RhbXAiOjE1NDY1MDcwMDczOTQ3MjUwMDB9", "data":"YWJj"},
    {"key":"eyJ0aW1lc3RhbXAiOjE1NDY1MDcwMTczOTQ3NDgwMDB9", "data":"dGVzdA=="}
]
dragon0170 commented 5 years ago

client에서 처리해서 console에 보여주는 Response

[ {"key":{"timestamp":1546507007394725000}, "data":"YWJj"}, {"key":{"timestamp":1546507017394748000}, "data":"dGVzdA=="} ]

kwjooo commented 5 years ago

UserKey에서 Ownerkey로 바꿔주는 게 좋을 것 같아요

kwjooo commented 5 years ago

RowKey라는 이름이 realdata fetch시에는 어울리지 않는 것 같아요. 후에 rocksdb를 사용하지 않을 테니.. SerializedKeyObj가 적당할 것 같아요

kwjooo commented 5 years ago

fetch 시 keyObj 만으로 조회하니 두 번째 가 더 간결하고 좋은 것 같아요

code-to-gold commented 5 years ago

현재 Context에서는 row key가 맞으니 rowkey로 가는게 좋을것 같습니다.

kwjooo commented 5 years ago

https://github.com/paust-team/paust-db/issues/41#issuecomment-455412170 두 번째 방식으로 reqQuery를 만들 시 저희만의 serialization, deserialization rule이 필요하므로 json형식으로 작업하는 게 좋을 것 같습니다

code-to-gold commented 5 years ago

Write query에 대한 json object 예시도 있으면 좋을 것 같습니다