The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package blx::xsdsql::xsd_parser::node::choice;
use base(qw(blx::xsdsql::xsd_parser::node));
use strict;
use warnings FATAL => 'all';
use integer;
use Carp;
use POSIX;
use Data::Dumper;
use blx::xsdsql::ut(qw(nvl));
use blx::xsdsql::xsd_parser::type;

use constant {
	DEFAULT_OCCURS_TABLE_PREFIX	=> 'm_'
};

sub trigger_at_start_node {
	my ($self,%params)=@_;
	my $parent_table=$self->_get_parent_table;
	my $path=$parent_table->get_path;
	my ($maxoccurs,$minoccurs)=(
		$self->_resolve_maxOccurs
		,$self->_resolve_minOccurs(CHOICE => $parent_table->get_attrs_value(qw(CHOICE)))
	);
	if ($maxoccurs > 1) {
		my $schema=$self->get_attrs_value(qw(STACK))->[1];
		my $table = $self->get_attrs_value(qw(TABLE_CLASS))->new(
			NAME			=> DEFAULT_OCCURS_TABLE_PREFIX.$parent_table->get_attrs_value(qw(NAME))
			,MAXOCCURS		=> $maxoccurs
			,PARENT_PATH	=> $path
			,CHOICE			=> 1
		);
		
		$schema->set_table_names($table);

		$table->_add_columns(
			$schema->get_attrs_value(qw(ANONYMOUS_COLUMN))->_factory_column(qw(ID))
			,$schema->get_attrs_value(qw(ANONYMOUS_COLUMN))->_factory_column(qw(SEQ))
		);
		$parent_table->_add_child_tables($table);
		my $isparent_choice=$parent_table->get_attrs_value(qw(CHOICE));

		my $column =  $self->get_attrs_value(qw(COLUMN_CLASS))->new (	 #hook the column to the parent table 
			NAME				=> $table->get_attrs_value(qw(NAME))
			,TYPE				=> $schema->get_attrs_value(qw(ID_SQL_TYPE))
			,MINOCCURS			=> 0
			,MAXOCCURS			=> 1
			,PATH_REFERENCE		=> $table->get_path
			,TABLE_REFERENCE	=> $table
			,CHOICE				=> $isparent_choice
			,ELEMENT_FORM 		=> $self->_resolve_form
		);

		if (defined $parent_table->get_xsd_seq) {	   #the table is a sequence or a choice 
			$column->set_attrs_value(XSD_SEQ => $parent_table->get_xsd_seq); 
			$parent_table->_inc_xsd_seq unless $isparent_choice;
		}
		$parent_table->_add_columns($column);
		$self->set_attrs_value(TABLE => $table);
	}
	else {
		$parent_table->set_attrs_value(CHOICE => 1);
		$parent_table->set_attrs_value(XSD_SEQ => 0) unless defined $parent_table->get_xsd_seq; 
		$self->set_attrs_value(TABLE => $parent_table);
	}
}

sub trigger_at_end_node {
	my ($self,%params)=@_;
	my $parent_table=$self->get_attrs_value(qw(STACK))->[-1]->get_attrs_value(qw(TABLE));
	$parent_table->_inc_xsd_seq;  
	return $self;
}


1;



__END__


=head1  NAME

blx::xsdsql::xsd_parser::node::choice - internal class for parsing schema 

=cut