The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package  perfSONAR_PS::DataModels::PingER_Model;
 
=head1 NAME

   perfSONAR_PS::DataModels::PingER_Model - perfSONAR schemas expressed in perl for pinger MA, used to build binding perl objects collection
 
=head1 DESCRIPTION

      see perfSONAR_PS::DataModels::DataModel for details. this is the perl way to extend something
  
   
=head1 SYNOPSIS

      ###  
      use perfSONAR_PS::DataModels::PingER_Model qw($message);
     
      
      ### thats it, next step is to build API by utilizing buildAPi from APIBuilder.pm package
      
      buildAPI('message', $message,  '', '' );
      
=cut 

=head1 Exported variables

        $message - the hasref with whole data model description for pinger MA message
 
=cut    
use strict;
use warnings;
use Data::Dumper;
BEGIN {
 use Exporter ();
 our (@ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
        use version; our $VERSION =    qv('2.0'); 
        # set the version for version checking
        #$VERSION     = 2.0;
        # if using RCS/CVS, this may be preferred
        #$VERSION = sprintf "%d.%03d", q$Revision: 1.1 $ =~ /(\d+)/g;
        %EXPORT_TAGS = ();
        @ISA         = qw(Exporter);
        @EXPORT     = qw( );
        
      
        @EXPORT_OK   =qw($message);
}
use   version;  
our @EXPORT_OK;

 
use   perfSONAR_PS::DataModels::DataModel   2.0 qw($endPointPair $interfaceL3  $message $metadata $data $addressL4 $endPoint $key
          $time $endPointL4 $addressL3 $service_subject $select_subj $select_params  
	   $service_parameters $resultDatum $commonTime $parameters $parameter $endPointPairL4); 

   
  ##############_-----------------------------mapping SQL on current schema ( the hardest part ), conditional 'if' added 
  
    $addressL3->{sql} =  {metaData => {'transport'  =>   {value => 'type'},
                                                      },  
					   host =>    {'ip_number'  =>   {value =>  ['value' , 'text']},
					              },
			 };
							
   $addressL4->{sql} =  {metaData => {'ip_name_src' => {'value' =>  ['value' , 'text'], 'if' => 'type:hostname'},
                                                        'ip_name_dst' => {'value' =>  ['value' , 'text'], 'if' => 'type:hostname'},
                                                      },
                                           host =>    {'ip_number'  =>  {'value' =>  ['value' , 'text'], 'if' => 'type:ipv4'},
					              },    
                        };
  
   $interfaceL3->{sql} =  {metaData => {'transport' =>   {'value' => 'ipAddress'},
                                                           'ip_name_src' => {'value' => 'ifHostName'},
							   'ip_name_dst' => {'value' => 'ifHostName'},
							  },
                                              host =>     {'ip_number'  =>  {'value' =>  'ipAddress'},
					                   'ip_name'    =>  {'value' => 'ifHostName'},
					                  }
		    };
 
   $endPointL4->{sql}= {metaData => {'ip_name_src' => {'value' => ['address', 'interface'], if => 'role:src'},
                                                            'ip_name_dst' => {'value' => ['address', 'interface'], if => 'role:dst'},
                                                            'transport'   => {'value' => ['address', 'interface']},
					                   },
                                               host =>     {'ip_number' =>   {'value' => ['address', 'interface']},
					                    'ip_name'   =>   {'value' => [ 'address' ,'interface']},
							   },
			}; 
    
    $endPoint->{attrs}->{type} = 'enum:hostname'; 							     
    
    $endPoint->{sql} = {metaData => {'ip_name_src' =>   { value => ['value' , 'text'], if => 'type:hostname'}, 
    							  'ip_name_dst' =>   { value => ['value' , 'text'], if => 'type:hostname'}, 
						         },
					     host =>     {'ip_number'  =>    { value => ['value' , 'text'], if => 'type:ipv4'}, 
					                  'ip_name'    =>    { value => ['value' , 'text'], if => 'type:hostname'}, 
							 },
		       }; 		 
  
 							 
    $endPointPair->{sql} =   {metaData => { 'ip_name_src' =>   { value => 'src'},  
                                            'ip_name_dst' =>   { value => 'dst'},  
						                },   
                                                    host =>     { 'ip_number' =>    { value => ['src', 'dst']},  
						                  'ip_name'    =>    { value => ['src', 'dst']},                                     
                                                                },
			     }; 	
						
   
   
   
   $parameter->{'attrs'} = {name => 'enum:count,packetInterval,packetSize,ttl,valueUnits,startTime,endTime,protocol,transport,setLimit', 
                            value => 'scalar', xmlns => 'nmwg'};
                  
   $parameter->{sql} =            {metaData => {count => { value =>  ['value' , 'text'], if => 'name:count'},
			                        packetInterval=> { value =>  ['value' , 'text'], if => 'name:packetInterval'},
				                packetSize=> { value => ['value' , 'text']  , if => 'name:packetSize'},
				                ttl=> { value =>   ['value' , 'text'] , if => 'name:ttl'},
				                protocol => { value =>   ['value' , 'text'] , if => 'name:protocol'},
				                transport => { value =>   ['value' , 'text'] , if => 'name:transport'},
                                                },
			           time     => {start =>  { value =>   ['value' , 'text'],  if => 'name:startTime'},
                                                end  =>   { value =>  ['value' , 'text'],  if => 'name:endTime'},
                                               },
			           limit    => {setLimit => { value =>   ['value' , 'text'],  if => 'name:setLimit'},			  
				                },
		                   }; 		  

    ########## next lines are commented because we selecting time from stupid parameters ( instead of proper time elements )
   ########
   # %{$time}  =   ( %{$time},  sql => { 'data' => { start => { value =>  'value' },
    #                                                           duration =>  { value =>  'duration'},
    #                                                           end =>   { value =>  'value'},
    #                                                           
	#						     },
	#						     
    #
     #                                             }); 	
  #  %{$commonTime} =   ( %{$commonTime }, sql => { 'data' => { start => { value => ['value','start']},
   #                                                            duration =>  { value =>  'duration' },
  #                                                             end =>   { value =>  'end'},
  #                                                             
  #							     },
 #							     
 #   
 #                                                 }); 	

   my $pingerDatum    =  {'attrs'  => {value => 'scalar',  valueUnits => 'scalar',  seqNum => 'scalar',    numBytes => 'scalar', ttl => 'scalar',
                                       name => 'enum:minRtt,maxRtt,meanRtt,medianRtt,lossPercent,clp,minIpd,maxIpd,iqrIpd,meanIpd,duplicates,outOfOrder',
                                       timeType => 'scalar', timeValue => 'scalar', xmlns => 'pinger'},
                          elements => [],
			  sql => {     'data' => {  
			                          minRtt  => { value =>  ['value' , 'text'], if => 'name:minRtt'},
			                          maxRtt  => { value => ['value' , 'text'], if => 'name:maxRtt'},
						  meanRtt => { value => ['value' , 'text'], if => 'name:meanRtt'},
						  medianRtt => { value => ['value' , 'text'], if => 'name:medianRtt'},
						  lossPercent   => { value => ['value' , 'text'], if => 'name:lossPercent'}, 
						  minIpd  => { value => ['value' , 'text'], if => 'name:minIpd'},  
						  maxIpd   => { value => ['value' , 'text'], if => 'name:maxIpd'}, 
						  iqrIpd   => { value => ['value' , 'text'], if => 'name:iqrIpd'}, 
						  meanIpd  => { value => ['value' , 'text'], if => 'name:meanIpd'}, 
						  clp =>  { value => ['value' , 'text'], if => 'name:clp'},
						  duplicates =>  { value => ['value' , 'text'], if => 'name:duplicates'},
						  outOfOrder =>  { value => ['value' , 'text'], if => 'name:outOfOrder'},
						  numBytes => { value =>  'numBytes'},
						  seqNums   => { value =>  'seqNum'},
						  ttl       => { value =>  'ttl'},
						  rtts =>    { value => 'value' },						
					      },
					      					             
				     },
			            
	                 };  
  
   push @{$commonTime->{elements}}, [datum => [$pingerDatum]]; 
 
    $service_parameters =  {'attrs'  => {id => 'scalar',   xmlns => 'pinger'},
                    elements => [
		               [parameter => [$parameter]], 
			      
			      ], 
	         }; 
    $service_subject= { 'attrs'   => {id => 'scalar', metadataIdRef => 'scalar',xmlns => 'pinger'},
                        elements => [
			                [endPointPair =>    [$endPointPair ,  $endPointPairL4]],
					 
				    ], 
	             };    
   $data = {'attrs'  => {id => 'scalar', metadataIdRef => 'scalar',xmlns => 'nmwg'},
 	       elements => [
 			    [commonTime  => [$commonTime]], 
			    [datum  => [[$pingerDatum], [$resultDatum]], 'unless:commonTime'],
 			    [key       =>   $key, 'unless:commonTime,datum'],    
 			   ],
 			    
 	      }; 
 
   $metadata = {'attrs'  => {id => 'scalar', metadataIdRef => 'scalar',xmlns => 'nmwg'},
 	       elements => [
 			    [subject    =>  [$service_subject, $select_subj]],
			    [parameters =>  [$select_params, $service_parameters]],
			    [eventType  =>  'text'], 
 			    [key        =>  $key], 
			  ], 
 	      }; 

  $message  = {  'attrs'  => {id => 'scalar', type => 'scalar', xmlns => 'nmwg'}, 
                  elements => [ 
		                [parameters =>  [$service_parameters]],
		                [metadata =>    [$metadata]], 
			        [data	   =>   [$data]]
			      ], 
	         }; 
   ### die  " Message definition: " . Dumper  $metadata;
   
 1;