| /** |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package org.apache.mrql; |
| |
| import java.util.*; |
| import java.lang.Math; |
| |
| |
| /** System functions must be from MRData to MRData */ |
| final public class SystemFunctions { |
| |
| // used for shortcutting sync in bsp supersteps |
| final public static Bag bsp_empty_bag = new Bag(); |
| final public static MR_bool bsp_true_value = new MR_bool(true); |
| final public static MR_bool bsp_false_value = new MR_bool(false); |
| |
| final static MRData null_value = new Tuple(0); |
| final static MR_bool true_value = new MR_bool(true); |
| final static MR_bool false_value = new MR_bool(false); |
| |
| private static void error ( String s ) { |
| System.err.println("*** "+s); |
| throw new Error(s); |
| } |
| |
| static Random random = new Random(); |
| |
| public static MR_bool synchronize ( MR_string peerName, MR_bool mr_exit ) { |
| return Evaluator.evaluator.synchronize(peerName,mr_exit); |
| } |
| |
| public static Bag distribute ( MR_string peerName, Bag s ) { |
| return Evaluator.evaluator.distribute(peerName,s); |
| } |
| |
| public static MR_bool lt ( MR_short x, MR_short y ) { return (x.get() < y.get()) ? true_value : false_value; } |
| public static MR_bool lt ( MR_int x, MR_int y ) { return (x.get() < y.get()) ? true_value : false_value; } |
| public static MR_bool lt ( MR_long x, MR_long y ) { return (x.get() < y.get()) ? true_value : false_value; } |
| public static MR_bool lt ( MR_float x, MR_float y ) { return (x.get() < y.get()) ? true_value : false_value; } |
| public static MR_bool lt ( MR_double x, MR_double y ) { return (x.get() < y.get()) ? true_value : false_value; } |
| |
| public static MR_bool gt ( MR_short x, MR_short y ) { return (x.get() > y.get()) ? true_value : false_value; } |
| public static MR_bool gt ( MR_int x, MR_int y ) { return (x.get() > y.get()) ? true_value : false_value; } |
| public static MR_bool gt ( MR_long x, MR_long y ) { return (x.get() > y.get()) ? true_value : false_value; } |
| public static MR_bool gt ( MR_float x, MR_float y ) { return (x.get() > y.get()) ? true_value : false_value; } |
| public static MR_bool gt ( MR_double x, MR_double y ) { return (x.get() > y.get()) ? true_value : false_value; } |
| |
| public static MR_bool leq ( MR_short x, MR_short y ) { return (x.get() <= y.get()) ? true_value : false_value; } |
| public static MR_bool leq ( MR_int x, MR_int y ) { return (x.get() <= y.get()) ? true_value : false_value; } |
| public static MR_bool leq ( MR_long x, MR_long y ) { return (x.get() <= y.get()) ? true_value : false_value; } |
| public static MR_bool leq ( MR_float x, MR_float y ) { return (x.get() <= y.get()) ? true_value : false_value; } |
| public static MR_bool leq ( MR_double x, MR_double y ) { return (x.get() <= y.get()) ? true_value : false_value; } |
| |
| public static MR_bool geq ( MR_short x, MR_short y ) { return (x.get() >= y.get()) ? true_value : false_value; } |
| public static MR_bool geq ( MR_int x, MR_int y ) { return (x.get() >= y.get()) ? true_value : false_value; } |
| public static MR_bool geq ( MR_long x, MR_long y ) { return (x.get() >= y.get()) ? true_value : false_value; } |
| public static MR_bool geq ( MR_float x, MR_float y ) { return (x.get() >= y.get()) ? true_value : false_value; } |
| public static MR_bool geq ( MR_double x, MR_double y ) { return (x.get() >= y.get()) ? true_value : false_value; } |
| |
| public static MR_bool eq ( MR_short x, MR_short y ) { return (x.get() == y.get()) ? true_value : false_value; } |
| public static MR_bool eq ( MR_int x, MR_int y ) { return (x.get() == y.get()) ? true_value : false_value; } |
| public static MR_bool eq ( MR_long x, MR_long y ) { return (x.get() == y.get()) ? true_value : false_value; } |
| public static MR_bool eq ( MR_float x, MR_float y ) { return (x.get() == y.get()) ? true_value : false_value; } |
| public static MR_bool eq ( MR_double x, MR_double y ) { return (x.get() == y.get()) ? true_value : false_value; } |
| |
| public static MR_bool neq ( MR_short x, MR_short y ) { return (x.get() != y.get()) ? true_value : false_value; } |
| public static MR_bool neq ( MR_int x, MR_int y ) { return (x.get() != y.get()) ? true_value : false_value; } |
| public static MR_bool neq ( MR_long x, MR_long y ) { return (x.get() != y.get()) ? true_value : false_value; } |
| public static MR_bool neq ( MR_float x, MR_float y ) { return (x.get() != y.get()) ? true_value : false_value; } |
| public static MR_bool neq ( MR_double x, MR_double y ) { return (x.get() != y.get()) ? true_value : false_value; } |
| |
| public static MR_bool eq ( MRData x, MRData y ) { return (x.compareTo(y) == 0) ? true_value : false_value; } |
| public static MR_bool neq ( MRData x, MRData y ) { return (x.compareTo(y) != 0) ? true_value : false_value; } |
| public static MR_bool lt ( MRData x, MRData y ) { return (x.compareTo(y) < 0) ? true_value : false_value; } |
| public static MR_bool leq ( MRData x, MRData y ) { return (x.compareTo(y) <= 0) ? true_value : false_value; } |
| public static MR_bool gt ( MRData x, MRData y ) { return (x.compareTo(y) > 0) ? true_value : false_value; } |
| public static MR_bool geq ( MRData x, MRData y ) { return (x.compareTo(y) >= 0) ? true_value : false_value; } |
| |
| public static MR_string plus ( MR_string x, MR_string y ) { return new MR_string(x.get()+y.get()); } |
| |
| public static Bag plus ( Bag x, Bag y ) { return x.union(y); } |
| |
| public static MR_short plus ( MR_short x, MR_short y ) { return new MR_short((short)(x.get()+y.get())); } |
| public static MR_int plus ( MR_int x, MR_int y ) { return new MR_int(x.get()+y.get()); } |
| public static MR_long plus ( MR_long x, MR_long y ) { return new MR_long(x.get()+y.get()); } |
| public static MR_float plus ( MR_float x, MR_float y ) { return new MR_float(x.get()+y.get()); } |
| public static MR_double plus ( MR_double x, MR_double y ) { return new MR_double(x.get()+y.get()); } |
| |
| public static MR_short minus ( MR_short x, MR_short y ) { return new MR_short((short)(x.get()-y.get())); } |
| public static MR_int minus ( MR_int x, MR_int y ) { return new MR_int(x.get()-y.get()); } |
| public static MR_long minus ( MR_long x, MR_long y ) { return new MR_long(x.get()-y.get()); } |
| public static MR_float minus ( MR_float x, MR_float y ) { return new MR_float(x.get()-y.get()); } |
| public static MR_double minus ( MR_double x, MR_double y ) { return new MR_double(x.get()-y.get()); } |
| |
| public static MR_short times ( MR_short x, MR_short y ) { return new MR_short((short)(x.get()*y.get())); } |
| public static MR_int times ( MR_int x, MR_int y ) { return new MR_int(x.get()*y.get()); } |
| public static MR_long times ( MR_long x, MR_long y ) { return new MR_long(x.get()*y.get()); } |
| public static MR_float times ( MR_float x, MR_float y ) { return new MR_float(x.get()*y.get()); } |
| public static MR_double times ( MR_double x, MR_double y ) { return new MR_double(x.get()*y.get()); } |
| |
| public static MR_short div ( MR_short x, MR_short y ) { return new MR_short((short)(x.get()/y.get())); } |
| public static MR_int div ( MR_int x, MR_int y ) { return new MR_int(x.get()/y.get()); } |
| public static MR_long div ( MR_long x, MR_long y ) { return new MR_long(x.get()/y.get()); } |
| public static MR_float div ( MR_float x, MR_float y ) { return new MR_float(x.get()/y.get()); } |
| public static MR_double div ( MR_double x, MR_double y ) { return new MR_double(x.get()/y.get()); } |
| |
| public static MR_int mod ( MR_int x, MR_int y ) { return new MR_int(x.get() % y.get()); } |
| public static MR_long mod ( MR_long x, MR_long y ) { return new MR_long(x.get() % y.get()); } |
| |
| public static MR_short min ( MR_short x, MR_short y ) { return new MR_short((short)(Math.min(x.get(),y.get()))); } |
| public static MR_int min ( MR_int x, MR_int y ) { return new MR_int(Math.min(x.get(),y.get())); } |
| public static MR_long min ( MR_long x, MR_long y ) { return new MR_long(Math.min(x.get(),y.get())); } |
| public static MR_float min ( MR_float x, MR_float y ) { return new MR_float(Math.min(x.get(),y.get())); } |
| public static MR_double min ( MR_double x, MR_double y ) { return new MR_double(Math.min(x.get(),y.get())); } |
| |
| public static MR_short max ( MR_short x, MR_short y ) { return new MR_short((short)(Math.max(x.get(),y.get()))); } |
| public static MR_int max ( MR_int x, MR_int y ) { return new MR_int(Math.max(x.get(),y.get())); } |
| public static MR_long max ( MR_long x, MR_long y ) { return new MR_long(Math.max(x.get(),y.get())); } |
| public static MR_float max ( MR_float x, MR_float y ) { return new MR_float(Math.max(x.get(),y.get())); } |
| public static MR_double max ( MR_double x, MR_double y ) { return new MR_double(Math.max(x.get(),y.get())); } |
| |
| public static MR_double sin ( MR_double x ) { return new MR_double(Math.sin(x.get())); } |
| public static MR_double cos ( MR_double x ) { return new MR_double(Math.cos(x.get())); } |
| public static MR_double tan ( MR_double x ) { return new MR_double(Math.tan(x.get())); } |
| public static MR_double asin ( MR_double x ) { return new MR_double(Math.asin(x.get())); } |
| public static MR_double acos ( MR_double x ) { return new MR_double(Math.acos(x.get())); } |
| public static MR_double atan ( MR_double x ) { return new MR_double(Math.atan(x.get())); } |
| public static MR_double pow ( MR_double x, MR_double y ) { return new MR_double(Math.pow(x.get(),y.get())); } |
| public static MR_double sqrt ( MR_double x ) { return new MR_double(Math.sqrt(x.get())); } |
| public static MR_double ceil ( MR_double x ) { return new MR_double(Math.ceil(x.get())); } |
| public static MR_double floor ( MR_double x ) { return new MR_double(Math.floor(x.get())); } |
| public static MR_double rint ( MR_double x ) { return new MR_double(Math.rint(x.get())); } |
| public static MR_int round ( MR_float x ) { return new MR_int((int)Math.round(x.get())); } |
| public static MR_long round ( MR_double x ) { return new MR_long(Math.round(x.get())); } |
| |
| public static MR_short plus ( MR_short x ) { return x; } |
| public static MR_int plus ( MR_int x ) { return x; } |
| public static MR_long plus ( MR_long x ) { return x; } |
| public static MR_float plus ( MR_float x ) { return x; } |
| public static MR_double plus ( MR_double x ) { return x; } |
| |
| public static MR_short minus ( MR_short x ) { return new MR_short((short)-x.get()); } |
| public static MR_int minus ( MR_int x ) { return new MR_int(-x.get()); } |
| public static MR_long minus ( MR_long x ) { return new MR_long(-x.get()); } |
| public static MR_float minus ( MR_float x ) { return new MR_float(-x.get()); } |
| public static MR_double minus ( MR_double x ) { return new MR_double(-x.get()); } |
| |
| public static MR_short abs ( MR_short x ) { return new MR_short((short) Math.abs(x.get())); } |
| public static MR_int abs ( MR_int x ) { return new MR_int(Math.abs(x.get())); } |
| public static MR_long abs ( MR_long x ) { return new MR_long(Math.abs(x.get())); } |
| public static MR_float abs ( MR_float x ) { return new MR_float(Math.abs(x.get())); } |
| public static MR_double abs ( MR_double x ) { return new MR_double(Math.abs(x.get())); } |
| |
| public static Inv inv ( MRData x ) { return new Inv(x); } |
| |
| public static MR_bool and ( MR_bool x, MR_bool y ) { return (x.get()) ? y : false_value; } |
| public static MR_bool or ( MR_bool x, MR_bool y ) { return (x.get()) ? true_value : y; } |
| public static MR_bool not ( MR_bool x ) { return (x.get()) ? false_value : true_value; } |
| |
| public static MR_bool toBool ( MR_string s ) { return (s.get().equals("true")) ? true_value : false_value; } |
| public static MR_short toShort ( MR_string s ) { return new MR_short(Short.parseShort(s.get())); } |
| public static MR_int toInt ( MR_string s ) { return new MR_int(Integer.parseInt(s.get())); } |
| public static MR_long toLong ( MR_string s ) { return new MR_long(Long.parseLong(s.get())); } |
| public static MR_float toFloat ( MR_string s ) { return new MR_float(Float.parseFloat(s.get())); } |
| public static MR_double toDouble ( MR_string s ) { return new MR_double(Double.parseDouble(s.get())); } |
| |
| public static MR_int random ( MR_int n ) { |
| int v = random.nextInt(n.get()); |
| return new MR_int(v); |
| } |
| |
| public static MR_float log ( MR_float n ) { return new MR_float(Math.log(n.get())); } |
| public static MR_double log ( MR_double n ) { return new MR_double(Math.log(n.get())); } |
| public static MR_float exp ( MR_float n ) { return new MR_float(Math.exp(n.get())); } |
| public static MR_double exp ( MR_double n ) { return new MR_double(Math.exp(n.get())); } |
| |
| public static MR_string string ( MRData x ) { return new MR_string(x.toString()); } |
| |
| public static MR_bool contains ( MR_string x, MR_string y ) { return new MR_bool(x.get().contains(y.get())); } |
| public static MR_int length ( MR_string x ) { return new MR_int(x.get().length()); } |
| public static MR_string substring ( MR_string x, MR_int b, MR_int e ) { return new MR_string(x.get().substring(b.get(),e.get())); } |
| |
| public static MR_bool exists ( Bag s ) { |
| return (s.iterator().hasNext()) ? true_value : false_value; |
| } |
| |
| public static MR_bool some ( Bag x ) { |
| for ( MRData e: x ) |
| if (e instanceof MR_bool) |
| if (((MR_bool)e).get()) |
| return true_value; |
| return false_value; |
| } |
| |
| public static MR_bool all ( Bag x ) { |
| for ( MRData e: x ) |
| if (e instanceof MR_bool) |
| if (!((MR_bool)e).get()) |
| return false_value; |
| return true_value; |
| } |
| |
| public static MR_bool member ( MRData e, Bag s ) { |
| return (s.contains(e)) ? true_value : false_value; |
| } |
| |
| public static MRData elem ( Bag s ) { |
| s.materialize(); |
| Iterator<MRData> it = s.iterator(); |
| if (it.hasNext()) |
| return it.next(); |
| throw new Error("method elem was applied on an empty bag"); |
| } |
| |
| public static MR_long count ( Bag s ) { |
| if (s.materialized()) |
| return new MR_long(s.size()); |
| long i = 0; |
| for ( MRData e: s ) |
| i++; |
| return new MR_long(i); |
| } |
| |
| public static MR_long hash_code ( MRData x ) { |
| return new MR_long(x.hashCode()); |
| } |
| |
| public static MRData index ( Bag b, MR_int mi ) { |
| int i = mi.get(); |
| if (i < 0) |
| throw new Error("wrong index: "+i); |
| if (b.materialized()) |
| return b.get(i); |
| int k = 0; |
| for ( MRData e: b ) |
| if (k++ == i) |
| return e; |
| throw new Error("wrong index: "+i); |
| } |
| |
| public static Bag range ( Bag b, MR_int mi, MR_int mj ) { |
| int i = mi.get(); |
| int j = mj.get(); |
| if (j < i) |
| throw new Error("wrong range indexes: "+i+","+j); |
| Bag bag = new Bag(j-i+1); |
| int k = 0; |
| for ( MRData e: b ) { |
| if (k >= i && k <= j) |
| bag.add(e); |
| k++; |
| }; |
| return bag; |
| } |
| |
| public static Bag union ( Bag x, Bag y ) { |
| return x.union(y); |
| } |
| |
| public static Bag intersect ( Bag x, Bag y ) { |
| x.materialize(); |
| Bag s = new Bag(); |
| for ( MRData e: y ) |
| if (x.contains(e)) |
| s.add(e); |
| return s; |
| } |
| |
| public static Bag except ( Bag x, Bag y ) { |
| y.materialize(); |
| Bag s = new Bag(); |
| for ( MRData e: x ) |
| if (!y.contains(e)) |
| s.add(e); |
| return s; |
| } |
| |
| public static Bag materialize ( Bag x ) { |
| x.materialize(); |
| return x; |
| } |
| |
| /** coerce a basic type to a new type indicated by the basic type number */ |
| public static MRData coerce ( MRData from, MR_int type ) { |
| byte tp = (byte)type.get(); |
| if (from instanceof MR_short) { |
| if (tp == MRContainer.BYTE) |
| return new MR_byte((byte)((MR_short)from).get()); |
| else if (tp == MRContainer.SHORT) |
| return from; |
| else if (tp == MRContainer.INT) |
| return new MR_int((int)((MR_short)from).get()); |
| else if (tp == MRContainer.LONG) |
| return new MR_long((long)((MR_short)from).get()); |
| else if (tp == MRContainer.FLOAT) |
| return new MR_float((float)((MR_short)from).get()); |
| else if (tp == MRContainer.DOUBLE) |
| return new MR_double((double)((MR_short)from).get()); |
| } else if (from instanceof MR_int) { |
| if (tp == MRContainer.BYTE) |
| return new MR_byte((byte)((MR_int)from).get()); |
| else if (tp == MRContainer.SHORT) |
| return new MR_short((short)((MR_int)from).get()); |
| else if (tp == MRContainer.INT) |
| return from; |
| else if (tp == MRContainer.LONG) |
| return new MR_long((long)((MR_int)from).get()); |
| else if (tp == MRContainer.FLOAT) |
| return new MR_float((float)((MR_int)from).get()); |
| else if (tp == MRContainer.DOUBLE) |
| return new MR_double((double)((MR_int)from).get()); |
| } else if (from instanceof MR_long) { |
| if (tp == MRContainer.BYTE) |
| return new MR_byte((byte)((MR_long)from).get()); |
| else if (tp == MRContainer.SHORT) |
| return new MR_short((short)((MR_long)from).get()); |
| else if (tp == MRContainer.INT) |
| return new MR_int((int)((MR_long)from).get()); |
| else if (tp == MRContainer.LONG) |
| return from; |
| else if (tp == MRContainer.FLOAT) |
| return new MR_float((float)((MR_long)from).get()); |
| else if (tp == MRContainer.DOUBLE) |
| return new MR_double((double)((MR_long)from).get()); |
| } else if (from instanceof MR_float) { |
| if (tp == MRContainer.BYTE) |
| return new MR_byte((byte)((MR_float)from).get()); |
| else if (tp == MRContainer.SHORT) |
| return new MR_short((short)((MR_float)from).get()); |
| else if (tp == MRContainer.INT) |
| return new MR_int((int)((MR_float)from).get()); |
| else if (tp == MRContainer.LONG) |
| return new MR_long((long)((MR_float)from).get()); |
| if (tp == MRContainer.FLOAT) |
| return from; |
| else if (tp == MRContainer.DOUBLE) |
| return new MR_double((double)((MR_float)from).get()); |
| } else if (from instanceof MR_double) { |
| if (tp == MRContainer.BYTE) |
| return new MR_byte((byte)((MR_double)from).get()); |
| else if (tp == MRContainer.SHORT) |
| return new MR_short((short)((MR_double)from).get()); |
| else if (tp == MRContainer.INT) |
| return new MR_int((int)((MR_double)from).get()); |
| else if (tp == MRContainer.LONG) |
| return new MR_long((long)((MR_double)from).get()); |
| if (tp == MRContainer.FLOAT) |
| return new MR_float((float)((MR_double)from).get()); |
| if (tp == MRContainer.DOUBLE) |
| return from; |
| }; |
| error("Cannot up-coerce the numerical value "+from); |
| return null; |
| } |
| |
| /** used in avg */ |
| public static MR_double avg_value ( MRData value ) { |
| Tuple t = (Tuple)value; |
| double sum = 0.0; |
| if (t.first() instanceof MR_double) |
| sum = ((MR_double)t.first()).get(); |
| else if (t.first() instanceof MR_int) |
| sum = ((MR_int)t.first()).get(); |
| else if (t.first() instanceof MR_long) |
| sum = ((MR_long)t.first()).get(); |
| else if (t.first() instanceof MR_float) |
| sum = ((MR_float)t.first()).get(); |
| long count = 0; |
| if (t.second() instanceof MR_long) |
| count = ((MR_long)t.second()).get(); |
| else if (t.second() instanceof MR_int) |
| count = ((MR_int)t.second()).get(); |
| return new MR_double(sum/count); |
| } |
| |
| /** used in avg */ |
| public static MRData avg_aggr ( Bag s ) { |
| double sum = 0.0; |
| long count = 0; |
| MRData e = null; |
| for ( MRData value: s ) { |
| Tuple t = (Tuple)value; |
| e = t.first(); |
| if (t.first() instanceof MR_double) |
| sum += ((MR_double)t.first()).get(); |
| else if (t.first() instanceof MR_int) |
| sum += ((MR_int)t.first()).get(); |
| else if (t.first() instanceof MR_long) |
| sum += ((MR_long)t.first()).get(); |
| else if (t.first() instanceof MR_float) |
| sum += ((MR_float)t.first()).get(); |
| if (t.second() instanceof MR_long) |
| count += ((MR_long)t.second()).get(); |
| else if (t.second() instanceof MR_int) |
| count += ((MR_int)t.second()).get(); |
| }; |
| if (e instanceof MR_double) |
| e = new MR_double(sum); |
| else if (e instanceof MR_int) |
| e = new MR_int((int)sum); |
| else if (e instanceof MR_long) |
| e = new MR_long((long)sum); |
| else if (e instanceof MR_float) |
| e = new MR_float((float)sum); |
| return new Tuple(e,new MR_long(count)); |
| } |
| |
| /** return the join key from a matching pair in the join reducer */ |
| public static MRData join_key ( Bag xs, Bag ys ) { |
| for ( MRData x: xs ) |
| return ((Tuple)x).get(0); |
| for ( MRData y: ys ) |
| return ((Tuple)y).get(0); |
| return null; |
| } |
| |
| public static MR_string text ( Union node ) { |
| if (node.tag() == 1) |
| return (MR_string)(node.value()); |
| Bag b = (Bag)((Tuple)node.value()).get(2); |
| String s = ""; |
| for ( MRData e: b ) |
| if (((Union)e).tag() == 1) |
| s += ((MR_string)(((Union)e).value())).get(); |
| return new MR_string(s); |
| } |
| |
| public static MR_string text ( Bag nodes ) { |
| MR_string b = new MR_string(""); |
| for ( MRData e: nodes ) |
| b = plus(b,text((Union)e)); |
| return b; |
| } |
| |
| public static MR_string tag ( Union node ) { |
| if (node.tag() == 1) |
| error("Cannot extract the tagname of a CData: "+node); |
| return (MR_string)((Tuple) node.value()).get(0); |
| } |
| |
| public static MR_string XMLattribute ( MR_string tagname, Union node ) { |
| if (node.tag() == 1) |
| error("Element "+node+" does not have attributes"); |
| Tuple t = (Tuple)node.value(); |
| String tag = tagname.get(); |
| for ( MRData c: (Bag)t.get(1) ) { |
| Tuple p = (Tuple)c; |
| if (tag.equals(((MR_string)(p.get(0))).get())) |
| return new MR_string(((MR_string)p.get(1)).get()); |
| }; |
| error("Element "+node+" does not have attribute "+tagname); |
| return null; |
| } |
| |
| public static Bag XMLattributes ( MR_string tagname, Union node ) { |
| if (node.tag() == 1) |
| return new Bag(); |
| Tuple t = (Tuple)node.value(); |
| Bag b = new Bag(); |
| String tag = tagname.get(); |
| for ( MRData c: (Bag)t.get(1) ) { |
| Tuple p = (Tuple)c; |
| if (tag.equals("*") || tag.equals(((MR_string)(p.get(0))).get())) |
| b.add(p.get(1)); |
| }; |
| return b; |
| } |
| |
| public static Bag XMLattributes ( MR_string tagname, Bag nodes ) { |
| Bag b = new Bag(); |
| for ( MRData e: nodes ) |
| for (MRData c: XMLattributes(tagname,(Union)e)) |
| b.add(c); |
| return b; |
| } |
| |
| public static Bag XMLattribute ( MR_string tagname, Bag nodes ) { |
| Bag b = new Bag(); |
| for ( MRData e: nodes ) |
| for (MRData c: XMLattributes(tagname,(Union)e)) |
| b.add(c); |
| return b; |
| } |
| |
| public static Bag XMLchildren ( MR_string tagname, Union node ) { |
| if (node.tag() == 1) |
| return new Bag(); |
| Tuple t = (Tuple)node.value(); |
| Bag b = new Bag(); |
| String tag = tagname.get(); |
| for ( MRData c: (Bag)t.get(2) ) |
| if (((Union)c).tag() == 0) { |
| Tuple s = (Tuple)(((Union)c).value()); |
| if (tag.equals("*") || (((MR_string)(s.get(0))).get()).equals(tag)) |
| b.add(c); |
| }; |
| return b; |
| } |
| |
| public static Bag XMLchildren ( MR_string tagname, Bag nodes ) { |
| Bag b = new Bag(); |
| for ( MRData e: nodes ) |
| for (MRData c: XMLchildren(tagname,(Union)e)) |
| b.add(c); |
| return b; |
| } |
| |
| public static MRData fold ( Lambda c, MRData z, Bag s ) { |
| MRData v = z; |
| for ( MRData e: s ) |
| z = c.lambda().eval(new Tuple(z,e)); |
| return z; |
| } |
| } |