Apache-Solr
view release on metacpan or search on metacpan
lib/Apache/Solr/XML.pm view on Meta::CPAN
sub decodeResponse($)
{ my ($self, $resp) = @_;
$resp->content_type =~ m/xml/i
or return undef;
my $dec = $self->xmlsimple->XMLin(
$resp->decoded_content || $resp->content,
parseropts => { huge => 1 },
);
_cleanup_parsed $dec;
}
sub _cleanup_parsed($)
{ my $data = shift;
if(!ref $data) { return $data }
elsif(ref $data eq 'HASH')
{ my %d = %$data; # start with shallow copy
# Hash
if(my $lst = delete $d{lst})
{ foreach (ref $lst eq 'ARRAY' ? @$lst : $lst)
{ my $name = delete $_->{name};
$d{$name} = $_;
}
}
# Array
if(my $arr = delete $d{arr})
{ foreach (ref $arr eq 'ARRAY' ? @$arr : $arr)
{ my $name = delete $_->{name};
my ($type, $values) = %$_;
$values = [$values] if ref $values ne 'ARRAY';
$d{$name} = $values;
}
}
# XXX haven't found a clear list of what can be expected here
foreach my $type (qw/int long float double bool date str text/)
{ my $items = delete $d{$type} or next;
foreach (ref $items eq 'ARRAY' ? @$items : $items)
{ my ($name, $value) = ref $_ eq 'HASH' ? ($_->{name}, $_->{_}) : ('', $_);
$value = $value eq 'true' || $_->{_} eq 1
if $type eq 'bool';
$d{$name} = $value;
}
}
foreach my $key (keys %d)
{ $d{$key} = _cleanup_parsed($d{$key}) if ref $d{$key};
}
return \%d;
}
elsif(ref $data eq 'ARRAY')
{ return [ map _cleanup_parsed($_), @$data ];
}
elsif(ref $data eq 'DateTime')
{ return $data;
}
else {panic ref $data || $data}
}
sub simpleUpdate($$;$)
{ my ($self, $command, $attrs, $content) = @_;
$attrs ||= {};
my $params = [ commit => delete $attrs->{commit} ];
my $endpoint = $self->endpoint('update', params => $params);
my $result = Apache::Solr::Result->new(params => $params, endpoint => $endpoint, core => $self);
my $doc = $self->simpleDocument($command, $attrs, $content);
$self->request($endpoint, $result, $doc);
$result;
}
sub simpleDocument($;$$)
{ my ($self, $command, $attrs, $content) = @_;
my $doc = XML::LibXML::Document->new('1.0', 'UTF-8');
my $top = $doc->createElement($command);
$doc->setDocumentElement($top);
$attrs ||= {};
$top->setAttribute($_ => $attrs->{$_}) for sort keys %$attrs;
if(!defined $content) {}
elsif(ref $content eq 'HASH' || ref $content eq 'ARRAY')
{ my @c = ref $content eq 'HASH' ? %$content : @$content;
while(@c)
{ my ($name, $values) = (shift @c, shift @c);
foreach my $value (ref $values eq 'ARRAY' ? @$values : $values)
{ my $node = $doc->createElement($name);
$node->appendText($value);
$top->addChild($node);
}
}
}
else
{ $top->appendText($content);
}
$doc;
}
sub endpoint($@)
{ my ($self, $action, %args) = @_;
my $params = $args{params} ||= [];
if(ref $params eq 'HASH') { $params->{wt} ||= 'xml' }
else { $args{params} = [ wt => 'xml', @$params ] }
$self->SUPER::endpoint($action => %args);
}
1;
( run in 1.621 second using v1.01-cache-2.11-cpan-39bf76dae61 )