On 09/28/2015 06:46 PM, Robert Hanson wrote: > //Thank you, Rolf, for working on the .select() business. /After taking > a close look at it, I decided the select() function was getting too > cryptic, and I agree that there were some inconsistencies there. What is > given below is much simpler. This long email message summarizes the > JmolSQL business, starting with Jmol 11.3.16_2015.09.28. See > http://chemapps.stolaf.edu///jmol/zip/jmol-14.3.16_2015.09.28.zip > Bob, thank for working on this. I agree that 'WHERE/WHEREIN" is much clearer than '*/**' with '*/**" additionally as wildcard options. But for me there is still left an inconsistency in the behaviour.
As far as I have seen the 'select' command now has essentially three things that determine the behaviour: 1) The type of the first-level and second-level array: "standard" or "associative". 2) The 'key' part of the query string (e.g.: "key1" or "(key1)") determines if whole structures are returned (no brackets) or only the values (brackets). And it also determines if only a subset of an array element or its values is returned. 3) The keywords 'WHERE', 'WHEREIN' and "no keyword" determine where is looked for matching data. Implemented are now the following combinations (among others), if I understood it correctly: A) associative + no brackets -> Searches in the first-level keys of the associative array. Returns a complete subset of the first-level array with the matching keys. B) associative + brackets -> Searches in the first-level keys of the associative array. Returns only the values (which can be scalars or arrays) behind the matching keys. C) standard/associative + no brackets -> Searches the second-level keys. Returns a subset of the first-level array with the named second-level keys only. D) standard/associative + brackets -> Searches the second-level keys. Returns the values behind the named second-level keys. E) standard/associative + WHERE + no brackets -> Searches keys from 2) and of phrase from 3) in the second-level keys of the associative arrays. Returns a complete subset of the first-level array with the matching second-level keys, restricted by the 'WHERE' phrase. F) standard/associative + WHERE + brackets -> Searches keys from 2) and of phrase from 3) in the second-level keys of the associative arrays. Returns only the values of the second-level array with the matching second-level keys, restricted by the 'WHERE' phrase. G) associative/associative + WHEREIN + no brackets -> Searches keys from 2) in the first-level keys and keys of phrase from 3) in the second-level keys of the associative arrays. Returns a subset of the first-level array with the matching first-level keys, restricted by the 'WHERE' phrase. H) associative/associative + WHEREIN + brackets -> Searches keys from 2) in the first-level keys and keys of phrase from 3) in the second-level keys of the associative arrays. Returns a subset of the values of the first-level array with the matching first-level keys, restricted by the 'WHERE' phrase. The multi-level combinations C) to F) have in common that the key restrictions from 1) act on the same level as the keys of the phrase from 3). In contrast in the multi-level combinations G) and H) the levels are mixed. This doesn't seem to be very consistent to me. At least it seems to be counterintuitive. Even if you don't agree, there are two missing cases where the levels are not mixed. Assuming a "consistent" behaviour they would look like this: ---- Example Code ------------ snpInfo = {"rs1229984": [resno: 48, from: "R", to: "H"], "rs1041969": [resno: 57, from: "N", to: "K"] }; print "=== Case 1 ===="; print snpInfo.select("from,to WHEREIN to='H'").format("JSON"); print "=== Case 2 ===="; snpInfo.select("(resno) WHEREIN to='H'"); ---- Example Output ----------- === Case 1 ==== {"rs1229984": {"from": "R","to":"H"}} === Case 2 ==== [48] -------------------------------- The second case could be solved by two consecutive 'select' commands. But that would make the usage much more complicated because one couldn't just provide a single selection filter string: print snpInfo.select("(*) WHEREIN from='R'").select("(resno)"); For my usual use of multi-level associative arrays these two cases would be the standard. But of course also the currently implemented two cases do make sense. I have no idea yet, how a good syntax for them could look like. Regards, Rolf -- Rolf Huehne Postdoc Leibniz Institute for Age Research - Fritz Lipmann Institute (FLI) Beutenbergstrasse 11 07745 Jena, Germany Phone: +49 3641 65 6205 Fax: +49 3641 65 6210 E-Mail: rhue...@fli-leibniz.de Website: http://www.fli-leibniz.de Scientific Director: Prof. Dr. K. Lenhard Rudolph Head of Administration: Dr. Daniele Barthel Chairman of Board of Trustees: Dennys Klein VAT No: DE 153 925 464 Register of Associations: No. 230296, Amtsgericht Jena Tax Number: 162/141/08228 ------------------------------------------------------------------------------ _______________________________________________ Jmol-users mailing list Jmol-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jmol-users