| 1042 | } |
| 1043 | |
| 1044 | func (b *booleanQuery) Select(t iterator) NodeNavigator { |
| 1045 | if b.iterator == nil { |
| 1046 | var list []NodeNavigator |
| 1047 | i := 0 |
| 1048 | root := t.Current().Copy() |
| 1049 | if b.IsOr { |
| 1050 | for { |
| 1051 | node := b.Left.Select(t) |
| 1052 | if node == nil { |
| 1053 | break |
| 1054 | } |
| 1055 | node = node.Copy() |
| 1056 | list = append(list, node) |
| 1057 | } |
| 1058 | t.Current().MoveTo(root) |
| 1059 | for { |
| 1060 | node := b.Right.Select(t) |
| 1061 | if node == nil { |
| 1062 | break |
| 1063 | } |
| 1064 | node = node.Copy() |
| 1065 | list = append(list, node) |
| 1066 | } |
| 1067 | } else { |
| 1068 | var m []NodeNavigator |
| 1069 | var n []NodeNavigator |
| 1070 | for { |
| 1071 | node := b.Left.Select(t) |
| 1072 | if node == nil { |
| 1073 | break |
| 1074 | } |
| 1075 | node = node.Copy() |
| 1076 | list = append(m, node) |
| 1077 | } |
| 1078 | t.Current().MoveTo(root) |
| 1079 | for { |
| 1080 | node := b.Right.Select(t) |
| 1081 | if node == nil { |
| 1082 | break |
| 1083 | } |
| 1084 | node = node.Copy() |
| 1085 | list = append(n, node) |
| 1086 | } |
| 1087 | for _, k := range m { |
| 1088 | for _, j := range n { |
| 1089 | if k == j { |
| 1090 | list = append(list, k) |
| 1091 | } |
| 1092 | } |
| 1093 | } |
| 1094 | } |
| 1095 | |
| 1096 | b.iterator = func() NodeNavigator { |
| 1097 | if i >= len(list) { |
| 1098 | return nil |
| 1099 | } |
| 1100 | node := list[i] |
| 1101 | i++ |