2013-01-13 5 views
1

eXist DB에서 세 번째 유형의 요소를 쿼리하는 데 사용하는 두 개의 요소 목록이 있습니다.목록에있는 노드에 elemens를 어떻게 추가 할 수 있습니까?

let $aList1 := for $elementB in $elementListB return //ElementA[ft:query(@referenceB, $elementB/@id)] 
let $aList2 := for $elementC in $elementListC return //ElementA[ft:query(@referenceC, $elementC/@id)] 
let $results := $aList1 intersect $aList2 

건이며, 내가 필요로하는 기능이있다 : 만 두 쿼리에 의해 발견되어 그 결과를 원하기 때문에하지만 그 두 개의 하위 결과의 교집합을 (즉, 초기 매개 변수의 두 가지를 만족) 시작 목록의 각 요소를 호출하여 몇 가지 추가 정보를 얻을 수 있습니다. 일반적으로 나는 같은 것을 할 것입니다 :

let $aList1 := for $elementB in $elementListB 
    let $additionalInfo := additionalInfoFunction($elementB) 
    return 
     <wrapper> 
     <additionalInfo>{$additionalInfo}</additionalInfo> 
     { 
      //ElementA[ft:query(@referenceB, $elementB/@id)] 
     } 
     </wrapper> 

을 그러나, 나는이 작업을 수행하는 경우 교차 참조하지 값으로 작동하기 때문에 나는 $aList1$aList2의 교차점을 수행 할 수 없습니다.

내가 이런 교차로 후 additionalInfoFunction를 호출 생각 :

return for $result in $results 
let $elementB := $elementListB[@id = $result/@referenceB] 
let $additionalInfo := additionalInfoFunction($elementB) 
return 
    <wrapper> 
    <additionalInfo>{$additionalInfo}</additionalInfo> 
    { 
     BLA BLA 
    } 
    </wrapper> 

그러나 여기에서 문제는 $elementListB$elementListC 단지 몇 요소를 포함하면서, $results이 문제가 additionalInfoFunction이기 때문에입니다 수백을 포함 할 수 있다는 것입니다 상대적으로 비싸다.

여기서 볼 수없는 영리한 해결 방법이 있습니까?

답변

0

XQuery는 불변 변수가있는 함수 언어이므로 부작용이 없습니다. 나는이 작업을 수행하는 경우 교차 참조하지 값으로 작동하기 때문에

그러나, 나는 $aList1$aList2의 교차점을 수행 할 수 없습니다. intersects 같은 함수 또는 연산자 참조를 반환하거나하지 않습니다 여부

(참조가 빠를 수) 구현에만 해당하지만, 모든 값이 불변으로,이 당신에게 문제가 될 수 없다.


실제 문제는 비슷하지만 유사하지는 않습니다. intersects은 deep-equal을 수행하지 않지만 내부 "노드 ID"(또는 원하는 경우 참조) 만 봅니다. 동일한 내용을 포함하지만 두 요소를 작성하면 다른 노드가 작성되므로 intersect은 결과를 리턴하지 않습니다.

당신은 너무 어렵지 않다 자신의 교차 구축해야합니다

: $a에서 하나를 깊은 동일 $b의 일부 요소가있는

let $a := (<a><a1/><a2/></a>, <b><b1/><b2/></b>), 
    $b := (<a><a1/><a2/></a>, <c><c1/><c2/></c>) 

return $a[ 
    some $e in $b 
    satisfies deep-equal(., $e) 
] 

$a의 모든 요소를 ​​반환됩니다 .

+0

당신이 묘사하는 문제는 제가 의미했던 것입니다. 어쩌면 충분히 명확하지 않을 수도 있습니다. 어쨌든, 당신의 솔루션은 효과가 있습니다. 감사합니다. 정기적 인 교차로와 비교하여이 접근법의 성능에 대한 아이디어는 있습니까? – pajevic

+0

'deep-equal'은 단순히 참조를 비교하는 것보다 훨씬 복잡합니다. 또한 해석 된 XQuery에서 루프를 수행하는 것은 구현의 모국어로 쓰여진 'intersects'보다 느릴 수 있습니다. 현재 실행중인 eXist 인스턴스가 없습니다. 벤치마킹을한다면 공유하십시오.;) –

+0

실제로, 모든 요소는 고유 한 ID를 가지고 있으므로, 나는 똑같은 값을 대신하는 대신에 그들을 비교할 수 있습니다 :'return $ a [$ b/$ id /. id]를 만족하는 일부 $ e $ – pajevic