Beefy Boxes and Bandwidth Generously Provided by pair Networks
Welcome to the Monastery
 
PerlMonks  

Re: tree-oriented query against table-oriented data

by esskar (Deacon)
on Jul 01, 2006 at 19:05 UTC ( [id://558797]=note: print w/replies, xml ) Need Help??


in reply to tree-oriented query against table-oriented data

i guess, this will not exist, because it is actually a combination of querying data from a database and displaying the result. Looks like a problem for a MVC solution.
  • Comment on Re: tree-oriented query against table-oriented data

Replies are listed 'Best First'.
Re^2: tree-oriented query against table-oriented data
by dimar (Curate) on Jul 04, 2006 at 15:36 UTC
    i guess, this will not exist, because it is actually a combination of querying data from a database and displaying the result.

    That is one way of evaluating the problem, however it is possible to 'rethink' the situation if you strip away pre-existing paradigms, methodologies, and ask the following:

    Given this:

    sitcom/simpsons/homer/simpson sitcom/simpsons/ned/flanders sitcom/flintstones/fred/flintstone sitcom/flintstones/wilma/flintstone sitcom/flintstones/barney/rubble gameshow/price is right/bob/barker gameshow/jeopardy/alex/trebek

    What can I use to transform it into this?:

    $dataroot = { 'gameshow' => { 'price is right' => [ { 'lname' => 'barker', 'fname' => 'bob' } ], 'jeopardy' => [ { 'lname' => 'trebek', 'fname' => 'alex' } ] }, 'sitcom' => { 'simpsons' => [ { 'lname' => 'simpson', 'fname' => 'homer' }, { 'lname' => 'flanders', 'fname' => 'ned' } ], 'flintstones' => [ { 'lname' => 'flintstone', 'fname' => 'fred' }, { 'lname' => 'flintstone', 'fname' => 'wilma' }, { 'lname' => 'rubble', 'fname' => 'barney' } ] } };

    The key consideration here is a simple question of transforming the flat 'row-based' representation into a 'nested representation'. This does not necessarily involve a database at all. Nor does it necessarily involve 'displaying' anything (unless you count using Data::Dumper to show the output for illustrative purposes only).

    =oQDlNWYsBHI5JXZ2VGIulGIlJXYgQkUPxEIlhGdgY2bgMXZ5VGIlhGV

      Try this:

      #! perl -slw use strict; use List::Util qw[ reduce ]; use Data::Dumper; my %data; while( <DATA> ) { my( $genre, $title, $fname, $lname ) = split '/'; $data{ $genre } = {} unless exists $data{ $genre }; $data{ $genre }{ $title } = [] unless exists $data{ $genre }{ $tit +le }; push @{ $data{ $genre }{ $title } }, { fname => $fname, lname => $ +lname }; }; print Dumper \%data; __DATA__ sitcom/simpsons/homer/simpson sitcom/simpsons/ned/flanders sitcom/flintstones/fred/flintstone sitcom/flintstones/wilma/flintstone sitcom/flintstones/barney/rubble gameshow/price is right/bob/barker gameshow/jeopardy/alex/trebek

      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      Lingua non convalesco, consenesco et abolesco. -- Rule 1 has a caveat! -- Who broke the cabal?
      "Science is about questioning the status quo. Questioning authority".
      In the absence of evidence, opinion is indistinguishable from prejudice.

      Just to refocus on the OP, the question was, (given the example 'one-off' solution that BrowserUk illustrated for this specific example, and considering the similarly-coded 'one-off' solutions by the OP in the past) where does there exist a "general purpose" mechanism to further abstract the process of doing this kind of transformation, such that there is no need to modify the 'one-off' code every time someone wants a different 'pivot' of the data structure.

      The question is now mostly academic, since the humble aspirant has gone on to code a solution himself, absent a preexisting and obvious choice out there.

      It is called 'vpath_pivot', named after the 'pivot table' feature found in spreadsheet software. It generates arbitrarily-nested tree structures using perl data variables, constructed from queries like:

      ### 1: provides same output as BrowserUk example TREE_SELECT genre,title,fname,lname FROM tvshow WITH_LEVELS ('genre','title' ) WITH_RECORD ( 'lname','fname' ) ### 2: a different 'pivot' of the same data TREE_SELECT title,genre,fname,lname FROM tvshow WITH_LEVELS ('title','genre','lname' ) WITH_RECORD ( 'fname' ) WHERE genre != 'gameshow' ### 3: another tree 'pivot' (more compact) TREE_SELECT title,fname,lname FROM tvshow WITH_LEVELS ('title' ) WITH_RECORD ( 'fname','lname' )

      NOTE: the above is not SQL, it just looks similar for readability.

      NOTE: the main approach here is to give the user the ability to 'slice and dice' the 'flat' data into different 'tree structures' all within a simple syntax (i.e., no need to re-edit the perl code).

      tyvm for the replies
      =oQDlNWYsBHI5JXZ2VGIulGIlJXYgQkUPxEIlhGdgY2bgMXZ5VGIlhGV

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://558797]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others about the Monastery: (6)
As of 2024-04-23 12:07 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found