begin process at 2012 05 28 14:43:23
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Divers

 > REQUÊTE DE TYPE SQL SUR UN OBJET JAVASCRIP COMPLEXE

REQUÊTE DE TYPE SQL SUR UN OBJET JAVASCRIP COMPLEXE


 Information sur la source

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Divers Classé sous :sql, query, array, object Niveau :Expert Date de création :01/02/2011 Date de mise à jour :02/02/2011 10:25:45 Vu / téléchargé :2 624 / 116

Auteur : emericv

Ecrire un message privé
Site perso
Commentaire sur cette source (6)
Ajouter un commentaire et/ou une note

 Description

Bonjour,

Cette fois-ci je poste un script qui permet, à partir de n'importe quel tableau d'objets complexes et hétérogènes, d'effectuer une sélection d'objets en utilisant une syntaxe proche du SQL.
Le script est hébergé à l'adresse :
http://svn.openihs.org/jsprojects/trunk/toolkit/j s/array.js
si vous avez un 404 not found, vérifiez qu'il n'y a pas d'espaces dans l'URL !

Ce script ajoute une méthode query à tous les tableau (plus exactement au prototype Array).

Fonction :
Array.prototype.query(request[, arg1..N])

Arguments :
request de type String et dont le format est REQUEST (voir ci-dessous)
arg1..N de tout type qui sont les éléments référencés dans la requête

Grammaire (la flemme de traduire) :
* REQUEST      := select FIELD_LIST [where CLAUSE_LIST] [limit [OFFSET,]LIMIT]
* FIELD_LIST   := * | FIELD[, FIELD[, FIELD[, etc.]]]
* FIELD        := PATH [as ALIAS]
* PATH         := object path foo.bar (must match with /[\w\.]+/)
* ALIAS        := result field name (must match with /\w+/)
* CLAUSE_LIST  := CLAUSE [EXP_OP CLAUSE [EXP_OP CLAUSE [etc]]]
*                 parenthesis are allowed eg (CLAUSE EXP_OP CLAUSE) EXP_OP CLAUSE, etc.
* EXP_OP       := and | or
* CLAUSE       := PATH OP VALUE
* OP           := =(equals)|<>(not equals)|!=(not equals)|~(match)|!~(don't match)
* VALUE        := true|false|null|NUMBER|STRING|TAG
* NUMBER       := a number (must match with /\d+/)
* STRING       := a string (must match with /("[\"]+")|('[\']+')/)
*                 WARNING: escaped quotes or double quotes is not supported: use TAG instead
* TAG          := %1..n refer to arg1..N
* OFFSET       := offset index
* LIMIT        := number of returned occurrences beginning at OFFSET index.

NOTES :
1. C'est une fonctionnalité que j'ai codé assez rapidement, en grande partie le matin dans le TGV en allant au boulot, donc soyez indulgent :-)
2. Bien entendu mon script n'a pas vocation de faire un SGBD en javascript
3. Les seuls opérateurs logiques supportés (entre les expressions) sont le "and" et le "or" (pas de "not")

Exemples d'utilisation.
On part du tableau suivant :

Source

  • addressBook = [
  • {
  • name: "Paul Durant",
  • phone: [
  • {type: "work", number: "0123456789"},
  • {type: "cellular", prefered: true, number: "0654321987"}
  • ],
  • addresses: [
  • {type: "work", street: "123 rue Truck", postal_code: "92000", city: "Nanterre"}
  • ]
  • }, {
  • name: "Jean Dupont",
  • phone: [
  • {type: "home", prefered: true, number: "0987654321"},
  • { type: "cellular", number: "0789456123"}
  • ],
  • addresses: [
  • {type: "home", street: "403 rue Inconnue", postal_code: "99999", city: "Laville"}
  • ]
  • }, {
  • name: "Nicolas Duchmole",
  • phone: [
  • {type: "home", prefered: true, number: "0258147369"},
  • {type: "cellular", number: "0639528417"}
  • ]
  • }, {
  • name: "Jean Durant",
  • phone: [
  • {type: "home", number: "0545654582"},
  • {type: "cellular", prefered: true, number: "0654123987"}
  • ],
  • addresses: [
  • {type: "home", street: "le coin paumé", postal_code: "11111", city: "La ville perdue"}
  • ]
  • }
  • ];
addressBook = [
  {
    name: "Paul Durant",
    phone: [
      {type: "work", number: "0123456789"},
      {type: "cellular", prefered: true, number: "0654321987"}
    ],
    addresses: [
      {type: "work", street: "123 rue Truck", postal_code: "92000", city: "Nanterre"}
    ]
  }, {
    name: "Jean Dupont",
    phone: [
      {type: "home", prefered: true, number: "0987654321"},
      { type: "cellular", number: "0789456123"}
    ],
    addresses: [
      {type: "home",  street: "403 rue Inconnue", postal_code: "99999", city: "Laville"}
    ]
  }, {
    name: "Nicolas Duchmole",
    phone: [
      {type: "home", prefered: true, number: "0258147369"},
      {type: "cellular", number: "0639528417"}
    ]
  }, {
    name: "Jean Durant",
    phone: [
      {type: "home", number: "0545654582"},
      {type: "cellular", prefered: true, number: "0654123987"}
    ],
    addresses: [
      {type: "home", street: "le coin paumé", postal_code: "11111", city: "La ville perdue"}
    ]
  }
];

 Conclusion

Maintenant, quelques exemples de requêtes...
dans les cas suivants je sélectionne des champs précis mais il y a la possibilité de récupérer les objets dans leur ensemble en mettant "select * [...]"

addressBook.query("select name, addresses.city where addresses.type = \"home\"") donne :
[{"name":"Jean Dupont","city":"Laville"},{"name":"Jean Durant","city":"La ville perdue"}]

addressBook.query("select name, phone.number as phoneNumber where (addresses.type = \"home\" or phone.type = \"work\") and name ~ %1", /Durant$/) donne :
[{"name":"Paul Durant","phoneNumber":"0123456789"},{"name":"Jean Durant","phoneNumber":"0545654582"}]

addressBook. query("select name, phone.number as phoneNumber where phone.prefered = true limit 1,2") donne :
[{"name":"Jean Dupont","phoneNumber":"0987654321"},{"name":"Nicol as Duchmole","phoneNumber":"0258147369"}]

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

01 février 2011 10:16:30 :
diverse corrections
01 février 2011 10:21:33 :
maj adresse
01 février 2011 10:25:50 :
problème dans la description: espace ajouté automatiquement dans l'URL
02 février 2011 10:25:45 :
ajout d'une archive ZIP

 Sources du même auteur

JAVASCRIPT, LA POO AUTREMENT...
Source avec Zip Source avec une capture JVSMENU : MENUS CLASSIQUES ET CONTEXTUELS AVANCÉS EN JAVASCR...

 Sources de la même categorie

Source avec Zip Source avec une capture SLIDESHOW IMAGES ET TEXTES EN PUR JAVASCRIPT par ansuzpeorth
Source avec Zip INPUT TEXT AUTOMATIQUE CREATION SUPPRESSION par lycanges
Source avec Zip Source avec une capture TABLE_SV : TABLEAU DYNAMIQUE, MONTRER/CACHER COLONNE SUR DEM... par synanceia
COLONNES ADAPTABLES EN HAUTEUR par dronoide
Source avec Zip VECTEURS ET MATRICES: OUTILS GRAPHIQUES UTILES par william voirol

 Sources en rapport avec celle ci

SELECTS DÉPENDANTS PRÉ-CHARGÉS D'UNE SEULE OPTION par phm
Source avec Zip PSEUDO CLASS JAVASCRIPT PERMET LE STORAGE(HTML5) D'UN TABLEA... par Magelo
Source avec Zip SYSTÈME DE REQUÊTE SUR DES DONNÉES JSON par Kimjoa
Source avec Zip LES COOKIES ET JAVASCRIPT par Zestyr
CHRONOMÉTRE EN JAVASCRIPT par simo5963

Commentaires et avis

Commentaire de Kimjoa le 01/02/2011 14:39:05 10/10

Sympas !!

J'ai regardé la source,  ... et bien t'aurais pu mettre expert ;)
Sinon c'est bien codé, même si je comprends pas grand chose vue le peux d'explication....  mais je suis pareil :)
Y'a quand même un truc que j'ai remarqué, c'est que tu devrais encapsuler tes variables et méthodes privée, dans une fonction anonyme.
Sinon coté fonctionnalité ... Ça serait cool de pouvoir mettre dans la clause where des select, un système de jointure aussi, mais en passant par le prototype de Array, ça risque d'être compliqué.
Bon sinon, ça permet de faire déjà pas mal de truc !!
Ça vaux bien une bonne note ;)
Sinon j'ai fait une source ce rapprochant un peux de la tienne tu devrait y jeter un oeil... a++

Commentaire de emericv le 01/02/2011 15:13:39

@Kimjoa

> tu devrais encapsuler tes variables et méthodes privée, dans une fonction anonyme
je pensais le faire justement, voilà qui est fait!
> Ça serait cool de pouvoir mettre dans la clause where des select, un système de jointure
Bin au fait je ne sais pas si tu a remarqué, mais il y a déjà un système de jointure automatique:
si tu fais un select sur un numéro de tel par exemple et que dans la clause where tu met phone.type = "cellular" il te retournera les numéros de portable. Autrement (en l'absence de clause phone._arrt_ = "qqch" par ex...), il retourne le premier numéro de la liste. La où mon système a ses limites c'est qu'il n'est pas capable de faire des vrais jointures et te retourner des résultats du genre
Nom1 tel1
Nom1 tel2
Nom2 tel1
Nom2 tel2
etc.
Cependant il reste toujours la possibilité de récupérer l'objet dans son ensemble...

Commentaire de emericv le 01/02/2011 15:17:44

@Kimjoa

> Sinon j'ai fait une source ce rapprochant un peux de la tienne tu devrait y jeter un oeil... a++
en effet j'ai vu ça juste après avoir posté le mien, et c'est vrai que c'est assez similaire.
(vu dans la section "Sources en rapport avec celle ci")

Commentaire de djtadpole le 02/02/2011 10:20:41

Bonjour,
cela a l'air pas mal.
Cependant, c'est moi ou on ne peut pas télécharger le code ?
merci.

Commentaire de emericv le 02/02/2011 10:28:03

@Djtadpole
en fait le moteur de rendu du site rajoute un espace dans mon URL ce qui la rend invalide
j'ai rajouté un ZIP contenant le fichier en question

Commentaire de djtadpole le 03/02/2011 12:52:48

@emericv
Parfait, merci

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Rafraichir sans recharger lapage [ par ricardcoca ] Bonjour , Je souhaiterais rafraichir deux variables en l'occurence dans mon exemple titre et pochette sans rafraichir toute la page. J'ai beau pa mysql_query($query) renvoie toujours false avec requête créer dans JavaScript. [ par jbiloeb ] Bonjour Je suis débutant en JavaScript et j&#8217;apprends en autodidacte par l&#8217;exemple donc désolé s&#8217;il y a une (des) grosse(s) bêtise(s) Variable POST [ par ghota ] Bonjour, j'aurais une question dans mon code. [code=js]function goAjaxPost(module,action,variables,id) { var xhr_object = null; var position = id; if panier d'achat mis a jour [ par Dav_c ] Bonjour, je code un script de e-commerce qui pour l'instant marche sans problème sauf que le panier ne s'actualise pas toujours. Bref un peu de code Array, Enelver élément indexé par une chaine [ par dark_naruto25 ] Bonjour à tous, J'utilise un Array pour garder des objets DOM. Pour retrouver ces éléments, j'utilise un indexage par String. Déjà qu'il n'est pas pos Au secours! Je ne comprends rien à J-Query @__@ [ par KawaiiNaNa ] [size=100]Bonsoir! Bon alors, comme le titre le dis très bien, je démarre avec javascript et j'aimerai aller plus loin pour pouvoir lancer mon blog pr caché un div après clic et ouverture d'une autre [ par wiby35 ] bonjour,je ne suis pas sur d'être dans la bonne partie du forum.. je vais essayer d'être claire et de faire simple ( heuuu c'est pas gagné )lol alor embed et object [ par jytest ] Bonjour à tous. J'ai une page THML qui ne veut pas fonctionner ni sur PC ni sur Mac. Et que ce soit en IE, Chrome, Firefox, Opera. Pourquoi ? Ce que Jquery Autocomplete ( Comment utiliser un requête SQL ) [ par popo60 ] Bonjour à tous, Mon problème est le suivant : Je n'arrive pas a implémenter l'API JQUERY Autocomplete pour faire une requête SQL a la place d'un tab parser un xml [ par zeitoun69 ] Bonjour je dois parser un fichier xml et former un tableau a partir des données extraite j'ai réussi a former le tableau mais les données sont celles


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,874 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales