Beefy Boxes and Bandwidth Generously Provided by pair Networks
"be consistent"
 
PerlMonks  

Re^2: tree-oriented query against table-oriented data

by dimar (Curate)
on Jul 04, 2006 at 15:36 UTC ( [id://559194]=note: print w/replies, xml ) Need Help??


in reply to Re: tree-oriented query against table-oriented data
in thread 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.

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

Replies are listed 'Best First'.
Re^3: tree-oriented query against table-oriented data
by BrowserUk (Patriarch) on Jul 04, 2006 at 22:57 UTC

    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.
Re^3: tree-oriented query against table-oriented data
by dimar (Curate) on Jul 05, 2006 at 15:11 UTC

    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://559194]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others studying the Monastery: (4)
As of 2024-04-24 01:17 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found