Skip to content

Commit 8f5c4ba

Browse files
authored
Merge pull request #7 from DesignLiquido/interacoes-sqlite
Ajustes no Cliente SQLite + Esboço do Tradutor
2 parents 08c0917 + b7e57ed commit 8f5c4ba

File tree

9 files changed

+129
-41
lines changed

9 files changed

+129
-41
lines changed

fontes/avaliador-sintatico/avaliador-sintatico.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,7 @@ export class AvaliadorSintatico extends AvaliadorSintaticoBase {
327327
}
328328

329329
return {
330-
declaracoes: declaracoes,
330+
comandos: declaracoes,
331331
erros: this.erros
332332
} as RetornoAvaliadorSintatico;
333333
}

fontes/comandos/selecionar.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1+
import { Condicao } from "../construtos";
12
import { Comando } from "./comando";
23

34
export class Selecionar extends Comando {
45
tabela: string;
56
colunas: string[];
67
tudo: boolean;
7-
condicoes: any[];
8+
condicoes: Condicao[];
89

9-
constructor(linha: number, tabela: string, colunas: string[], condicoes: any[], tudo = false) {
10+
constructor(linha: number, tabela: string, colunas: string[], condicoes: Condicao[], tudo = false) {
1011
super(linha);
1112
this.tabela = tabela;
1213
this.tudo = tudo;

fontes/infraestrutura/sqlite/index.ts

Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,27 @@
11
import * as caminho from 'node:path';
22

3-
import { ISqlite } from '../../interfaces';
43
import sqlite3 from 'sqlite3';
54

6-
export class Sqlite implements ISqlite {
5+
export class ClienteSQLite {
76
bancoDeDadosInstancia: sqlite3.Database;
87
readonly caminhoRaiz: string;
98
caminhoTotalArquivo: string;
109

11-
constructor() {
12-
this.caminhoRaiz = __dirname;
10+
// Segundo a documentação, o método new sqlite3.Database()
11+
// pode receber 3 formas de filename
12+
// caminho do arquivo exemplo: /tmp/banco.db
13+
// ":memory:" para criar um banco de dados em memória
14+
// null para criar um banco de dados temporário
15+
constructor(origemDados: string | null) {
16+
this.caminhoRaiz = process.cwd();
1317
this.caminhoTotalArquivo = null;
14-
}
1518

16-
private async abrir(arquivo: string | null): Promise<void> {
17-
if (arquivo !== ':memory:' && arquivo !== null) {
18-
this.caminhoTotalArquivo = caminho.join(this.caminhoRaiz, arquivo);
19+
if (origemDados !== ':memory:' && origemDados !== null) {
20+
this.caminhoTotalArquivo = caminho.join(this.caminhoRaiz, origemDados);
1921
}
2022

2123
this.bancoDeDadosInstancia = new sqlite3.Database(
22-
arquivo,
24+
origemDados,
2325
(erro: Error) => {
2426
if (erro) {
2527
console.error(erro.message);
@@ -29,6 +31,7 @@ export class Sqlite implements ISqlite {
2931
}
3032
);
3133
}
34+
3235
private async fechar(): Promise<void> {
3336
this.bancoDeDadosInstancia.close((erro: Error) => {
3437
if (erro) {
@@ -38,17 +41,7 @@ export class Sqlite implements ISqlite {
3841
});
3942
}
4043

41-
// Segundo a documentação, o método new sqlite3.Database()
42-
// pode receber 3 formas de filename
43-
// caminho do arquivo exemplo: /tmp/banco.db
44-
// ":memory:" para criar um banco de dados em memória
45-
// null para criar um banco de dados temporário
46-
47-
public iniciar(filename: string | null): void {
48-
this.abrir(filename);
49-
}
50-
51-
public executarSqlite(sql: string): void {
44+
public executarComando(sql: string): void {
5245
if (!this.bancoDeDadosInstancia) {
5346
console.log(
5447
'Não foi possível executar o SQLite. Você precisa inicializar o banco de dados.'

fontes/interfaces/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
11
export { ILincones } from './lincones-interface';
2-
export { ISqlite } from './sqlite-interface';
32
export { AvaliadorSintaticoInterface } from './avaliador-sintatico-interface';
43
export * from './simbolo-interface';

fontes/interfaces/retornos/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { ErroAvaliadorSintatico } from '../../avaliador-sintatico';
33
import { Comando } from '../../comandos';
44

55
export interface RetornoAvaliadorSintatico {
6-
declaracoes: Comando[];
6+
comandos: Comando[];
77
erros: ErroAvaliadorSintatico[];
88
}
99

fontes/interfaces/sqlite-interface.ts

Lines changed: 0 additions & 10 deletions
This file was deleted.

fontes/tradutor/index.ts

Lines changed: 73 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,75 @@
1+
import { Comando, Selecionar } from "../comandos";
2+
3+
import tiposDeSimbolos from "../tipos-de-simbolos";
4+
15
export class Tradutor {
2-
6+
7+
traduzirOperador(operador: string) {
8+
switch (operador) {
9+
case tiposDeSimbolos.IGUAL:
10+
return '=';
11+
}
12+
}
13+
14+
traduzirComandoAtualizar() {
15+
return '';
16+
}
17+
18+
traduzirComandoCriar() {
19+
return '';
20+
}
21+
22+
traduzirComandoExcluir() {
23+
return '';
24+
}
25+
26+
traduzirComandoInserir() {
27+
return '';
28+
}
29+
30+
traduzirComandoSelecionar(comandoSelecionar: Selecionar) {
31+
let resultado = 'SELECT ';
32+
33+
// Colunas
34+
if (comandoSelecionar.tudo) {
35+
resultado += '*'
36+
} else {
37+
for (const coluna of comandoSelecionar.colunas) {
38+
resultado += coluna + ', ';
39+
}
40+
41+
resultado = resultado.slice(0, -2);
42+
}
43+
44+
resultado += `\nFROM ${comandoSelecionar.tabela}`;
45+
46+
// Condições
47+
if (comandoSelecionar.condicoes.length > 0) {
48+
resultado += '\n WHERE ';
49+
for (const condicao of comandoSelecionar.condicoes) {
50+
resultado += `${condicao.esquerda.lexema} ${this.traduzirOperador(condicao.operador)} ${condicao.direita} AND `;
51+
}
52+
resultado = resultado.slice(0, -5);
53+
}
54+
55+
return resultado;
56+
}
57+
58+
dicionarioComandos = {
59+
Atualizar: this.traduzirComandoAtualizar.bind(this),
60+
Criar: this.traduzirComandoCriar.bind(this),
61+
Excluir: this.traduzirComandoExcluir.bind(this),
62+
Inserir: this.traduzirComandoInserir.bind(this),
63+
Selecionar: this.traduzirComandoSelecionar.bind(this)
64+
}
65+
66+
traduzir(comandos: Comando[]) {
67+
let resultado = '';
68+
69+
for (const comando of comandos) {
70+
resultado += `${this.dicionarioComandos[comando.constructor.name](comando)} \n`;
71+
}
72+
73+
return resultado;
74+
}
375
}

testes/avaliador-sintatico.test.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ describe('Avaliador Sintático', () => {
2020
const resultadoAvaliadorSintatico =
2121
avaliadorSintatico.analisar(resultadoLexador);
2222
expect(resultadoAvaliadorSintatico).toBeTruthy();
23-
expect(resultadoAvaliadorSintatico.declaracoes).toHaveLength(2);
23+
expect(resultadoAvaliadorSintatico.comandos).toHaveLength(2);
2424
expect(resultadoAvaliadorSintatico.erros).toHaveLength(0);
2525
});
2626

@@ -32,7 +32,7 @@ describe('Avaliador Sintático', () => {
3232
const resultadoAvaliadorSintatico =
3333
avaliadorSintatico.analisar(resultadoLexador);
3434
expect(resultadoAvaliadorSintatico).toBeTruthy();
35-
expect(resultadoAvaliadorSintatico.declaracoes).toHaveLength(2);
35+
expect(resultadoAvaliadorSintatico.comandos).toHaveLength(2);
3636
expect(resultadoAvaliadorSintatico.erros).toHaveLength(0);
3737
});
3838

@@ -44,7 +44,7 @@ describe('Avaliador Sintático', () => {
4444
const resultadoAvaliadorSintatico =
4545
avaliadorSintatico.analisar(resultadoLexador);
4646
expect(resultadoAvaliadorSintatico).toBeTruthy();
47-
expect(resultadoAvaliadorSintatico.declaracoes).toHaveLength(1);
47+
expect(resultadoAvaliadorSintatico.comandos).toHaveLength(1);
4848
expect(resultadoAvaliadorSintatico.erros).toHaveLength(0);
4949
});
5050

@@ -56,7 +56,7 @@ describe('Avaliador Sintático', () => {
5656
const resultadoAvaliadorSintatico =
5757
avaliadorSintatico.analisar(resultadoLexador);
5858
expect(resultadoAvaliadorSintatico).toBeTruthy();
59-
expect(resultadoAvaliadorSintatico.declaracoes).toHaveLength(1);
59+
expect(resultadoAvaliadorSintatico.comandos).toHaveLength(1);
6060
expect(resultadoAvaliadorSintatico.erros).toHaveLength(0);
6161
});
6262

@@ -68,7 +68,7 @@ describe('Avaliador Sintático', () => {
6868
const retornoAvaliadorSintatico =
6969
avaliadorSintatico.analisar(retornoLexador);
7070
expect(retornoAvaliadorSintatico).toBeTruthy();
71-
expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(1);
71+
expect(retornoAvaliadorSintatico.comandos).toHaveLength(1);
7272
expect(retornoAvaliadorSintatico.erros).toHaveLength(0);
7373
});
7474
});

testes/tradutor.test.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import { AvaliadorSintatico } from "../fontes/avaliador-sintatico";
2+
import { Lexador } from "../fontes/lexador";
3+
import { Tradutor } from "../fontes/tradutor";
4+
5+
describe('Tradutor', () => {
6+
let lexador: Lexador;
7+
let avaliadorSintatico: AvaliadorSintatico;
8+
let tradutor: Tradutor;
9+
10+
describe('traduzir()', () => {
11+
describe('Cenário de sucesso', () => {
12+
beforeEach(() => {
13+
lexador = new Lexador();
14+
avaliadorSintatico = new AvaliadorSintatico();
15+
tradutor = new Tradutor();
16+
});
17+
18+
it('Selecionar', () => {
19+
const codigo = [
20+
'SELECIONAR NOME, EMAIL DE clientes ONDE IDADE = 18;'
21+
];
22+
const retornoLexador = lexador.mapear(codigo);
23+
const retornoAvaliadorSintatico =
24+
avaliadorSintatico.analisar(retornoLexador);
25+
const resultado = tradutor.traduzir(retornoAvaliadorSintatico.comandos);
26+
expect(resultado).toBeTruthy();
27+
expect(resultado).toContain('SELECT');
28+
expect(resultado).toContain('FROM');
29+
expect(resultado).toContain('WHERE');
30+
});
31+
});
32+
});
33+
});

0 commit comments

Comments
 (0)