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: "sal": "Q29iamVjdCBJbnQ4QXJyYXlf", 5: "tipo": "treinador" 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" (nome): "Dragões", 5: "nameabbr": "DRG", 6: "registro": [ 7: { 8: "perdas": 16, 9: "laços": 2, 10: "ganha": 24, 11: "yearid": 2014 12: }, 13: { 14: "perdas": 3, 15: "laços": 0, 16: "ganha": 7, 17: "yearid": 2015 18: } 19: ], 20: "tipo": "equipe" 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: função (doc, meta) { 2: se(doc.hometeambatting &lificador;&lificador; meta.id.subcadeia(0,5) != "_sync") { 3: para (i=0; i < doc.hometeambatting.comprimento; i++) { 4: emitir([doc.hometeambatting[i].playerid, doc.yearid], 5: [doc.hometeambatting[i].x, doc.hometeambatting[i].y, 6: doc.hometeambatting[i].tipo de golpe]); 7: } 8: } 9: se(doc.longe de tudo &lificador;&lificador; meta.id.subcadeia(0,5) != &cotação;_sync&cotação;) { 10: para (i=0; i < doc.longe de tudo.comprimento; i++) { 11: emitir([doc.longe de tudo[i].playerid, doc.yearid], 12: [doc.longe de tudo[i].x, doc.longe de tudo[i].y, 13: doc.longe de tudo[i].tipo de golpe]); 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: função Treinador( id, e-mail, hash, sal, rev ) { 2: este.ID do treinador = id; 3: este.e-mail = e-mail; 4: este.hash = hash; 5: este.sal = sal; 6: este.rev = rev; 7: este.someCoachFunction = função() {//Fazer algo 8: } 9: este.toJSON = função() { 10: retorno JSON.stringify( { 11: _id: este.ID do treinador, 12: e-mail: este.e-mail, 13: hash: este.hash, 14: sal: este.sal, 15: _rev: este.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