[Bio] / Sprout / ERDB.pm Repository:
ViewVC logotype

Diff of /Sprout/ERDB.pm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.86, Mon Feb 12 19:23:32 2007 UTC revision 1.88, Tue Apr 10 05:54:18 2007 UTC
# Line 6  Line 6 
6      use Data::Dumper;      use Data::Dumper;
7      use XML::Simple;      use XML::Simple;
8      use DBQuery;      use DBQuery;
9      use DBObject;      use ERDBObject;
10      use Stats;      use Stats;
11      use Time::HiRes qw(gettimeofday);      use Time::HiRes qw(gettimeofday);
12      use Digest::MD5 qw(md5_base64);      use Digest::MD5 qw(md5_base64);
# Line 744  Line 744 
744      # Loop through the relations.      # Loop through the relations.
745      for my $relationName (@relNames) {      for my $relationName (@relNames) {
746          # Create a table for this relation.          # Create a table for this relation.
747          $self->CreateTable($relationName);          $self->CreateTable($relationName, 1);
748          Trace("Relation $relationName created.") if T(2);          Trace("Relation $relationName created.") if T(2);
749      }      }
750  }  }
# Line 2053  Line 2053 
2053    
2054  =item RETURN  =item RETURN
2055    
2056  Returns a list of B<DBObject>s that satisfy the query conditions.  Returns a list of B<ERDBObject>s that satisfy the query conditions.
2057    
2058  =back  =back
2059    
# Line 2773  Line 2773 
2773    
2774  =item RETURN  =item RETURN
2775    
2776  Returns a B<DBObject> representing the desired entity instance, or an undefined value if no  Returns a B<ERDBObject> representing the desired entity instance, or an undefined value if no
2777  instance is found with the specified key.  instance is found with the specified key.
2778    
2779  =back  =back
# Line 3336  Line 3336 
3336      return $retVal;      return $retVal;
3337  }  }
3338    
3339    =head3 BeginTran
3340    
3341    C<< $erdb->BeginTran(); >>
3342    
3343    Start a database transaction.
3344    
3345    =cut
3346    
3347    sub BeginTran {
3348        my ($self) = @_;
3349        $self->{_dbh}->begin_tran();
3350    
3351    }
3352    
3353    =head3 CommitTran
3354    
3355    C<< $erdb->CommitTran(); >>
3356    
3357    Commit an active database transaction.
3358    
3359    =cut
3360    
3361    sub CommitTran {
3362        my ($self) = @_;
3363        $self->{_dbh}->commit_tran();
3364    }
3365    
3366    =head3 RollbackTran
3367    
3368    C<< $erdb->RollbackTran(); >>
3369    
3370    Roll back an active database transaction.
3371    
3372    =cut
3373    
3374    sub RollbackTran {
3375        my ($self) = @_;
3376        $self->{_dbh}->roll_tran();
3377    }
3378    
3379    
3380  =head2 Data Mining Methods  =head2 Data Mining Methods
3381    
# Line 3543  Line 3583 
3583    
3584  C<< my @relationMap = _RelationMap($mappedNameHashRef, $mappedNameListRef); >>  C<< my @relationMap = _RelationMap($mappedNameHashRef, $mappedNameListRef); >>
3585    
3586  Create the relation map for an SQL query. The relation map is used by B<DBObject>  Create the relation map for an SQL query. The relation map is used by B<ERDBObject>
3587  to determine how to interpret the results of the query.  to determine how to interpret the results of the query.
3588    
3589  =over 4  =over 4
# Line 3560  Line 3600 
3600  =item RETURN  =item RETURN
3601    
3602  Returns a list of 2-tuples. Each tuple consists of an object name as used in the  Returns a list of 2-tuples. Each tuple consists of an object name as used in the
3603  query followed by the actual name of that object. This enables the B<DBObject> to  query followed by the actual name of that object. This enables the B<ERDBObject> to
3604  determine the order of the tables in the query and which object name belongs to each  determine the order of the tables in the query and which object name belongs to each
3605  mapped object name. Most of the time these two values are the same; however, if a  mapped object name. Most of the time these two values are the same; however, if a
3606  relation occurs twice in the query, the relation name in the field list and WHERE  relation occurs twice in the query, the relation name in the field list and WHERE
# Line 4254  Line 4294 
4294              if ($found == 0) {              if ($found == 0) {
4295                  push @{$indexList}, { IndexFields => [ {name => 'id', order => 'ascending'} ] };                  push @{$indexList}, { IndexFields => [ {name => 'id', order => 'ascending'} ] };
4296              }              }
4297              # Now we need to convert the relation's index list to an index table. We begin by creating              # Attach all the indexes to the relation.
4298              # an empty table in the relation structure.              _ProcessIndexes($indexList, $relation);
             $relation->{Indexes} = { };  
             # Loop through the indexes.  
             my $count = 0;  
             for my $index (@{$indexList}) {  
                 # Add this index to the index table.  
                 _AddIndex("idx$count", $relation, $index);  
                 # Increment the counter so that the next index has a different name.  
                 $count++;  
             }  
4299          }          }
4300          # Finally, we add the relation structure to the entity.          # Finally, we add the relation structure to the entity.
4301          $entityStructure->{Relations} = $relationTable;          $entityStructure->{Relations} = $relationTable;
# Line 4300  Line 4331 
4331          my $thisRelation = { Fields => _ReOrderRelationTable($relationshipStructure->{Fields}),          my $thisRelation = { Fields => _ReOrderRelationTable($relationshipStructure->{Fields}),
4332                               Indexes => { } };                               Indexes => { } };
4333          $relationshipStructure->{Relations} = { $relationshipName => $thisRelation };          $relationshipStructure->{Relations} = { $relationshipName => $thisRelation };
4334    
4335            # Add the alternate indexes (if any). This MUST be done before the FROM and
4336            # TO indexes, because it erases the relation's index list.
4337            if (exists $relationshipStructure->{Indexes}) {
4338                _ProcessIndexes($relationshipStructure->{Indexes}, $thisRelation);
4339            }
4340            # Add the relation to the master table.
4341          # Create the FROM and TO indexes.          # Create the FROM and TO indexes.
4342          _CreateRelationshipIndex("From", $relationshipName, $relationshipStructure);          _CreateRelationshipIndex("From", $relationshipName, $relationshipStructure);
4343          _CreateRelationshipIndex("To", $relationshipName, $relationshipStructure);          _CreateRelationshipIndex("To", $relationshipName, $relationshipStructure);
         # Add the relation to the master table.  
4344          $masterRelationTable{$relationshipName} = $thisRelation;          $masterRelationTable{$relationshipName} = $thisRelation;
4345      }      }
4346      # Now store the master relation table in the metadata structure.      # Now store the master relation table in the metadata structure.
# Line 4462  Line 4499 
4499      _AddIndex("idx$indexKey", $relationStructure, $newIndex);      _AddIndex("idx$indexKey", $relationStructure, $newIndex);
4500  }  }
4501    
4502    =head3 _ProcessIndexes
4503    
4504    C<< ERDB::_ProcessIndexes($indexList, $relation); >>
4505    
4506    Build the data structures for the specified indexes in the specified relation.
4507    
4508    =over 4
4509    
4510    =item indexList
4511    
4512    Reference to a list of indexes. Each index is a hash reference containing an optional
4513    C<Notes> value that describes the index and an C<IndexFields> value that is a reference
4514    to a list of index field structures. An index field structure, in turn, is a reference
4515    to a hash that contains a C<name> attribute for the field name and an C<order>
4516    attribute that specifies either C<ascending> or C<descending>. In this sense the
4517    index list encapsulates the XML C<Indexes> structure in the database definition.
4518    
4519    =item relation
4520    
4521    The structure that describes the current relation. The new index descriptors will
4522    be stored in the structure's C<Indexes> member. Any previous data in the structure
4523    will be lost.
4524    
4525    =back
4526    
4527    =cut
4528    
4529    sub _ProcessIndexes {
4530        # Get the parameters.
4531        my ($indexList, $relation) = @_;
4532        # Now we need to convert the relation's index list to an index table. We begin by creating
4533        # an empty table in the relation structure.
4534        $relation->{Indexes} = { };
4535        # Loop through the indexes.
4536        my $count = 0;
4537        for my $index (@{$indexList}) {
4538            # Add this index to the index table.
4539            _AddIndex("idx$count", $relation, $index);
4540            # Increment the counter so that the next index has a different name.
4541            $count++;
4542        }
4543    }
4544    
4545  =head3 _AddIndex  =head3 _AddIndex
4546    
4547  Add an index to a relation structure.  Add an index to a relation structure.

Legend:
Removed from v.1.86  
changed lines
  Added in v.1.88

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3