KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > gnu > kawa > xml > IntersectNodes


1 // Copyright (c) 2003 Per M.A. Bothner.
2
// This is free software; for terms and warranty disclaimer see ./COPYING.
3

4 package gnu.kawa.xml;
5 import gnu.mapping.*;
6 import gnu.lists.*;
7
8 /** Get the union of two node lists.
9  * Implements the XQuery 'intersect' and 'except' operators.
10  */

11
12 public class IntersectNodes extends Procedure2
13 {
14   /** True if implementing 'except'; false if implementing 'intersect'. */
15   boolean isExcept;
16
17   public static final IntersectNodes intersectNodes
18     = new IntersectNodes(false);
19   public static final IntersectNodes exceptNodes
20     = new IntersectNodes(true);
21
22   public IntersectNodes (boolean isExcept) { this.isExcept = isExcept; }
23
24   public Object JavaDoc apply2 (Object JavaDoc vals1, Object JavaDoc vals2)
25   {
26     SortedNodes nodes1 = new SortedNodes();
27     SortedNodes nodes2 = new SortedNodes();
28     SortedNodes result = new SortedNodes();
29     //throw new Error("unimplemented");
30
Values.writeValues(vals1, nodes1);
31     Values.writeValues(vals2, nodes2);
32     int i2 = 0;
33     
34     AbstractSequence seq2 = null;
35     int ipos2 = 0;
36
37     // Result of AbstractSequence.compare(prev_seq1, prev_ipos1, seq2, ipos2),
38
// where (prev_seq1, prev_ipos1) is the nodes from the "previous" iteration
39
int cmp = 0;
40
41     for (int i1 = 0; ; i1++)
42       {
43     AbstractSequence seq1 = nodes1.getSeq(i1);
44     if (seq1 == null)
45       break;
46     int ipos1 = nodes1.getPos(i1);
47
48     // cmp == -2: Reached end of nodes2 (i2 >= nodes2.size()).
49
// cmp == -1: Previous node1 before node2, so need to re-compare.
50
// cmp == 0: Previous node1==node2, so need to read from nodes2.
51
// [Not possible: cmp == 1].
52

53     if (cmp == -1)
54       cmp = AbstractSequence.compare(seq1, ipos1, seq2, ipos2);
55     else if (cmp == 0)
56       cmp = 1;
57
58     while (cmp > 0)
59       {
60         seq2 = nodes2.getSeq(i2);
61         if (seq2 == null)
62           {
63         cmp = -2;
64         break;
65           }
66         else
67           {
68         ipos2 = nodes2.getPos(i2++);
69         cmp = AbstractSequence.compare(seq1, ipos1, seq2, ipos2);
70           }
71       }
72
73     if ((cmp == 0) != isExcept)
74       result.writePosition(seq1, ipos1);
75       }
76
77     return result;
78   }
79 }
80
Popular Tags