SQL en action

Restez en contact, suivez CodinGame for Work
Ce weekend, j'ai concocté un exercice SQL tout simple pour expliquer comment il est possible d'intégrer des bibliothèques externes dans Weecod. Vous verrez vite que cela n'a rien de très compliqué : le tout a été réalisé en moins de 30 lignes de code.
Le résultat est ici : https://weecod.com/sqldemo







Etape 1: Créez un nouvel exercice

(J'utilise Java comme langage de référence pour jouer avec SQL.)
Allez dans l'onglet Dashboard > Editeur de questions > Créer un nouvel exercice de programmation en Java. 
Etape 2: Ajoutez les dépendances externes
J'ai packagé deux bibliothèques dans un même fichier zip :
  • HSQLDB, une base de données relationnelle écrite en Java (licence BSD). C'est léger, rapide et compatible avec les standards SQL. 
  • Une simple classe utilitaire pour afficher les résultats d'une requête SQL dans la console (pour tester une solution) et pour valider que deux requêtes SQL retournent le même résultat (pour valider une solution). Vous pouvez obtenir le code source depuis le fichier zip.
Dans l'éditeur de question, uploadez les bibliothèques dans "Ajouter des dépendances".
Etape 3: Un squelette de solution
class SQL {
 static String query = "SELECT * FROM customer";
}
C'est ici que les candidats devront mettre à jour la requête pour fournir leur propre solution.
Etape 4: Le code pour tester la solution
import java.sql.*;
import com.weecod.sql.*;

public class Tester {

 public static void main(String[] args) throws SQLException {
   Connection conn = DriverManager.getConnection("jdbc:hsqldb:mem:mydb", "sa", "");
   conn.createStatement().executeUpdate("CREATE TABLE customer (firstname VARCHAR(32), lastname VARCHAR(32))");

   PreparedStatement insert = conn.prepareStatement("INSERT INTO customer VALUES (?,?)");
   String[][] inserts = { { "Andrew", "Walton" }, { "Lili", "Ma" }, { "Laurent", "Giroux" } };
   for (String[] d : inserts) {
     insert.setString(1, d[0]);
     insert.setString(2, d[1]);
     insert.executeUpdate();
   }
   SQLHelper.displayResults(SQL.query, conn);
//##DISPLAY_BEGIN##
//##DISPLAY_END##
 }
}
Je crée ici une base de données ainsi que la table "customer". Simplement, ce bout de code effectue des insertions qui permettront au candidat de tester sa requête dans des conditions réelles d'utilisation.
Le résultat s'affichera dans la console.
Facile.
Etape 5: Le code pour valider la solution
import java.sql.*;
import com.cartser.codemachine.java.*;
import com.cartser.codemachine.java.lafouine.*;
import com.weecod.sql.*;

public class Validator extends WeecodValidator {

 Connection conn;
 String validSelect = "SELECT firstname FROM customer WHERE firstname LIKE 'L%' ORDER BY firstname";

 public void validate() throws Exception {
   prepareDB();
   SQLHelper.validateResults(SQL.query, validSelect, conn);
 }

 void prepareDB() throws SQLException {
   conn = DriverManager.getConnection("jdbc:hsqldb:mem:mydb", "sa", "");
   conn.createStatement().executeUpdate("CREATE TABLE customer (firstname VARCHAR(32), lastname VARCHAR(32))");

   PreparedStatement insert = conn.prepareStatement("INSERT INTO customer VALUES (?,?)");
   String[][] inserts = { { "Laurie", "Akia" }, { "Andrew", "Walton" }, { "Lara", "Croft" } };
   for (String[] d : inserts) {
     insert.setString(1, d[0]);
     insert.setString(2, d[1]);
     insert.executeUpdate();
   }
 }
}

C'est assez similaire à l'étape précédente, excepté qu'ici, on cherche à vérifier que la solution fonctionne correctement. Le résultat d'une requête valide (validSelect) est comparé au résultat de la requête du candidat. Si les résultats des requêtes sont différents, SQLHelper.validateResults lève une exception et la solution est donc invalidée. 

Aucun commentaire

Enregistrer un commentaire