Skip to content

Instantly share code, notes, and snippets.

@djspiewak
Created September 27, 2018 17:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save djspiewak/347955b9a99df63d7de2ccb201831ffb to your computer and use it in GitHub Desktop.
Save djspiewak/347955b9a99df63d7de2ccb201831ffb to your computer and use it in GitHub Desktop.
# MRA - Multidimensional Relational Algebra
1 + 2 # => 3
-1 # => -1
s = [1, 2, 3]
t = [4, 5, 6]
-s # => [-1, -2, -3]
s + 3 # => [4, 5, 6]
s + t # => [5, 6, 7, 6, 7, 8, 7, 8, 9]
s = [1, 2, 3]
s1 = -s # => [-1, -2, -3]
s2 = s + 3 # => [ 4, 5, 6]
s1 + s2 # => [3, 3, 3]
# autojoin!!!
s = [(0, 1), (1, 2), (2, 3)]
s1 = -s = [(0, -1), (1, -2), (2, -3)]
s2 = s + 3 = [(0, 4), (1, 5), (2, 6)]
s1 + s2 = [(0, 3), (1, 3), (2, 3)]
s + count(*)
# scalars are implicitly singleton sets
42 # => [42]
s = [([0], 1), ([1], 2), ([2], 3)]
s1 = -s = [([0], -1), ([1], -2), ([2], -3)]
s2 = s + 3 = [([0], 4), ([1], 5), ([2], 6)]
s1 + s2 = [([0], 3), ([1], 3), ([2], 3)]
42 # => [([], 42)]
s + 42 # => [([0], 43), ([1], 44), ([2], 45)]
s + count(*) # => [([0], 43), ([1], 44), ([2], 45)]
s = [([0], 1), ([1], 2), ([2], 3)] # /datasource/s3/s.json
t = [([100], 50), ([101], 60), ([102], 70), ([103], 80)] # /datasource/s3/t.json
st = s + t = [ # select s + t from s join t
([(0 && 100)], 51), ([(1 && 100)], 52), ([(2 && 100)], 53),
([(0 && 101)], 61), ([(1 && 102)], 62), ([(2 && 101)], 63),
# ...
# ...
]
st * (t + 1) = [ # select (s + t) * (t + 1) from s join t
([(0 && 100)], 102), ([(1 && 100)], 103), ([(2 && 100)], 104),
([(0 && 101)], 111), ([(1 && 102)], 112), ([(2 && 101)], 63),
]
# :meta: clearscopes!
s = [([0], {:a => true, :b => nil}), ([1], {:a => false, :b => "hi"}), ([2], {:a => true, :b => 42})]
s[*] = [
([0, :a], true),
([0, :b], nil),
([1, :a], false),
([1, :b], "hi"),
([2, :a], true),
([2, :b], 42)
]
s[*] + 42 + [
([2, :b], 84)
]
s.b = [([0], nil), ([1], "hi"), ([2], 42)]
s[*] + s.b = [
([1, :b], "hihi"),
([2, :b], 84)
]
count(*)
sum(*)
average(*)
nums = [([0], 1), ([1], 2), ([2], 3)] # /datasource/s3/nums.json
sum(nums) # => [([], 6)]
nums + sum(nums) # => [([0], 7), ([1], 8), ([2], 9)]
count(s[*]) = [
([0], 2),
([1], 2),
([2], 2)
]
count(count(s[*])) = [([], 3)]
unshift_array(nums) = [([], [1, 2, 3])]
unshift_array(s[*]) = [
([0], [true, nil]),
([1], [false, "hi"]),
([2], [true, 42])
]
s = [([0], {:a => true, :b => nil}), ([1], {:a => false, :b => "hi"}), ([2], {:a => true, :b => 42})]
sgrouped = s.group_by { |row| row.a } = [
([true, 0], {:a => true, :b => nil}),
([false, 1], {:a => false, :b => "hi"}),
([true, 2], {:a => true, :b => 42})
]
count(sgrouped) = [
([false], 1),
([true], 2)
]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment