Preparando-se para a temporada de beisebol, ScoreMore Beisebol recentemente, acabou de acertar em cheio com o lançamento de seu aplicativo em todas as principais plataformas móveis. Um dos principais diferenciais do aplicativo é o uso de Couchbase que foi discutido no Blog ScoreMore com o Couchbase Mobile. Neste blog, exploraremos como o aplicativo projetou seus mapeadores de objetos e obteve suas visualizações.
Para o ScoreMore, o design do mapa de relação de objetos é manter um atributo específico para "tipo" a fim de identificar o tipo de "objeto" o documento é. No beisebol, uma equipe é formada por membros com várias funções. No exemplo abaixo, "type": "coach" é para um documento que contém todas as informações de um técnico durante o jogo. Outras funções serão definidas por seus respectivos "tipo"
|
1 2 3 4 5 6 7 |
1: { 2: "email": "demo@example.com", 3: "hash": "da5ce4f993719a61d531963e6242f4cb3091a497ed448c88dbn83m015", 4: "salt": "Q29iamVjdCBJbnQ4QXJyYXlf", 5: "type": "coach" 6: } |
Observação: hash e salt são para armazenamento de senhas, _id e _rev não são mostrados, pois são gerados automaticamente pelo Couchbase. Versões legíveis para humanos de _id serão usadas em exemplos futuros, como "coach_1"
Em alguns documentos, o nó de nível inferior de uma estrutura pode ser rolado para uma matriz no documento proprietário. O exemplo clássico é o de transferir todos os endereços de um contato para uma matriz. No ScoreMore Baseball, cada contato de um rebatedor "hit" é acumulado em uma matriz para o jogo em que ocorreu. Da mesma forma, para uma equipe, o registro de vitórias e derrotas de cada temporada é acumulado em uma matriz na Equipe. Dessa forma, há uma definição clara do primeiro grau de separação e relacionamento entre os atributos.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
1: { 2: "coachid": "coach_1", 3: "leagueid": "league_1", 4: "name": "Dragons", 5: "nameabbr": "DRG", 6: "record": [ 7: { 8: "losses": 16, 9: "ties": 2, 10: "wins": 24, 11: "yearid": 2014 12: }, 13: { 14: "losses": 3, 15: "ties": 0, 16: "wins": 7, 17: "yearid": 2015 18: } 19: ], 20: "type": "team" 21: } |
A equipe do Score More Baseball também mantém os resultados do beisebol organizados em seu Visualizações, em que cada View retorna apenas documentos de um único "tipo". Com as visualizações, a primeira verificação será uma instrução "if-clause", validando documentos que correspondam a uma determinada "tipo"especificado por uma verificação do "tipo" ou em relação a um campo que seja exclusivo desse tipo de documento. Um exemplo abaixo é a visualização do gráfico de pulverização, que mostra o local de cada rebatida que o jogador já fez.
O código abaixo primeiro verifica se o documento (nesse caso, um jogo) contém uma matriz de acertos para o time da casa ou para o time visitante, omitindo os documentos gerados pelo Sync Gateway. Em seguida, ele itera por todas essas ocorrências e, se os parâmetros de pesquisa do Player (especificados por 'playerid') para a temporada em questão (especificada por 'yearid') correspondem ao hit, então o 'hit' é adicionado ao conjunto de resultados. Cada local de acerto tem um 'x' e 'y' bem como um conjunto de 'tipo'indicando se a rebatida foi uma bola voadora, uma linha de transmissão ou uma bola rasteira.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
1: function (doc, meta) { 2: if(doc.hometeambatting && meta.id.substring(0,5) != "_sync") { 3: for (i=0; i < doc.hometeambatting.length; i++) { 4: emit([doc.hometeambatting[i].playerid, doc.yearid], 5: [doc.hometeambatting[i].x, doc.hometeambatting[i].y, 6: doc.hometeambatting[i].hittype]); 7: } 8: } 9: if(doc.awayteambatting && meta.id.substring(0,5) != "_sync") { 10: for (i=0; i < doc.awayteambatting.length; i++) { 11: emit([doc.awayteambatting[i].playerid, doc.yearid], 12: [doc.awayteambatting[i].x, doc.awayteambatting[i].y, 13: doc.awayteambatting[i].hittype]); 14: } 15: } 16: } |
Por exemplo, o gráfico de pulverização abaixo mostra o local de todas as rebatidas do "jogador_1" na temporada de 2015, tendo (key=["jogador_1", 2015]) Pontos vermelhos representam bolas voadoras, pontos brancos são line drives e pontos amarelos são bolas rasteiras.
Por fim, no lado do cliente, o ScoreMore usou estruturas JavaScript que são, na verdade, representações de objetos dos vários tipos de documentos disponíveis: Técnico, Jogador, Equipe, Jogo, etc. Os construtores de cada uma dessas estruturas de objeto pegam os resultados retornados da visualização e os mapeiam para as propriedades do objeto. Indo na outra direção (armazenando no banco de dados a partir do aplicativo), o JSON.stringify é usado para ir da estrutura do objeto para o formato JSON que o Couchbase está esperando para a operação POST.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
1: function Coach( id, email, hash, salt, rev ) { 2: this.coachID = id; 3: this.email = email; 4: this.hash = hash; 5: this.salt = salt; 6: this.rev = rev; 7: this.someCoachFunction = function() {//Do Something 8: } 9: this.toJSON = function() { 10: return JSON.stringify( { 11: _id: this.coachID, 12: email: this.email, 13: hash: this.hash, 14: salt: this.salt, 15: _rev: this.rev 16: }); 17: } 18: } |
Ouça como Couchbase Mobile forneceu à equipe do ScoreMore as ferramentas tecnológicas necessárias para atingir o sucesso na Café no Couchbase: ScoreMore com o Couchbase Mobile Blog e não deixe de baixar o aplicativo que já está disponível para Android, iOSe BlackBerry.
Obrigado, senhor