Opened 12 years ago

Closed 12 years ago

#166 closed defect (fixed)

query.php incorrectly using nextShape() instead of MapServer resultcache

Reported by: Matej Mailing Owned by: jimk
Priority: major Milestone: 2.6.1
Component: GeoMOOSE/PHP Version: 2.6
Keywords: query.php Cc:

Description

we have a problem when using Search with the query.php. The problem is
that we always get a message: "No results found for your query! " even
though I am sure that the item with such an attribute exists. When
turning on the debug mode in query.php the output is:
"...
queryLayer iterated through
Total Results: 0
Results from MS: <a id="data-shape="coords"
href="javascript:GeoMOOSE.zoomToPointsList(dojo.byId('data-[ID]').getAttribute("data-shape'),
'EPSG...');">data<br/>\n"

It's strange that the result from MS includes the result with the
correct attributes from the DB, but Total Results is 0.

I have found out that "while($shape = $queryLayer->nextShape()) {"
line is never true, therefore the code inside (which does the
counting) never executes.

Since we are getting the data back from the Mapserver I suppose the
Mapfile and the Mapbook.xml contents are correct.

What could be wrong here?

Change History (4)

comment:1 by jimk, 12 years ago

Status: newassigned

Ok... looking at the MapServer code, it looks like msQueryByRect eventually calls msLayerWhichShapes, but then steps through all the results using msLayerNextShape and populates the layer's result cache.

So either we need to call whichShapes (instead of queryByRect) before our nextShapes while loop, and then call $map->queryByRect before our processTemplate (which is already there), or we need to call queryByRect and then loop through the result cache.

while($shape = $queryLayer->nextShape()) {

...

}

to

for($i = 0; i < $queryLayer->getNumResults(); i++) {

$shape = $queryLayer->getResult(i);
...

}

Although, since I'm not convinced that the shape re-projection code will work (it is re-projecting shapes it doesn't "own" and so is either re-projecting a copy and then throwing out the result or it is modifying the layer's result cache, which I'm not sure is "legal"), just setting

$numResults = $queryLayer->getNumResults();

and dropping the while(nextShape) loop may be cleaner.

comment:2 by jimk, 12 years ago

I have changed it this way and it works when there are no results and
when there are results, without the need for the nextShape() call:

for($i = 0; $i <

$queryLayer->getNumResults(); $i++) {

$shape =

$queryLayer->getShape($queryLayer->getResult($i));

if($projection) {

$shape->project($projection, $LATLONG_PROJ);

}
$resultFeatures[] = $shape;
$numResults += 1;

}

In my understanding there must be a loop to fill the $resultFeatures
since in mode 'map' they are drawn from it.

Regards,
Matej

comment:3 by jimk, 12 years ago

Status: assignedtesting

Applied in r926.

comment:4 by bfischer, 12 years ago

Resolution: fixed
Status: testingclosed
Note: See TracTickets for help on using tickets.