o++oPS (ottoProgrammingScript) essentially is a linear query language, but it also allows a wide range of computations.

It uses repeating groups (hierarchies) and has several powerful but easy to use operations for selection, restructuring, computation and joining tables and documents.

Features of o++oPS

  • Short programs.
  • Simple syntax; Operation names are easy to remember.
  • Already programs as a cooking recipe (sequential processing) are very expressive.
  • Conditions do not have to be linked; they can be applied one after the other; two consecutive conditions are not always synonymous with their conjunction (increased expressiveness).
  • Powerful operations for selection, restructuring, calculation, combination and solution of BOM problems.
  • Compact (hsq) and simple (tab) display of tabs (tables and documents).
  • Aggregations without GROUPBY; GROUPBY cannot be applied to data streams.
  • No Cartesian product (cross product); in the cross product, each element of one table is always merged with each element of the other table. This also creates very large intermediate tables in mind. Join-Conditions are always required.
  • User functionality can be integrated into o++o programs; this means that embeddings of o++o in conventional programming languages such as JAVA or C become less important.
  • At o++o, programming methodology is about computer efficiency; the latter is largely guaranteed by improved hardware.
  • The basic operations are easier to understand than the algorithm of decimal multiplication.
  • Search trees could be integrated into Tabmente; this results in a much better efficiency for many problem classes.
  • Implementation in OCaml (INRIA Paris); This makes o++o to a purely European product.

Aims of o++oPS

  • There should be a readable program behind each click; if the end user then has a problem with the computer result, he can modify the program himself until he has achieved the desired result.
  • Advanced requests to Wikipedia; At the moment, much information from Wikipedia can only be extracted with great manual effort.
  • o ++ o should become a universal interface for tables and documents; i.e. the user should be able to query any databases, files, retrieval systems and the Internet with uniform means.
  The  book  contains  numerous examples to guarantee a quick access to the language.
It contains chapters about comparisons with SQL and other languages, about the specification of tabments (TABle+ docuMENT), about query optimization and about storage structures.

Structure Meets Tables and Documents

       students.tab: STID, NAME, LOC?, SAL, DEPT, (COURSE, MARK l), (PROJ, HOURS m)m 

       m: set (Menge) ; l: List; a student contains 2 repeating groups (exams and projects)


Enduser Meets Programming

Query 1: Give all students, who heard databases and algebra.

aus students.tab
avec {Algebra Database} in COURSEm
# aus: from
# avec (French): with (where)


Query 2: Give for each name, who has an exam in database all further courses with marks.

  aus students.tab
avec STID! COURSE=Database
sans COURSE! COURSE=Database

# selects students
# selects exams; sans: without
# b:bag


Query 3: Print for all courses with mark 1 all students and the counts of these students per course and totally.

  aus students.tab
avec MARK=1
    CNT! ++1 STID

# selects students and courses

# counts students


Query 4: Give all students, containing the word Otto.

  aus students.tab
avec Otto

Computation 1: Compute the gross values of several prices.

  77 79 567 432

Computation 2: Compute the gross-value of each position and the sum of all gross values.

OttoRAMDB  500      20
OttoWiki    10     200
OttoCalc    20    4000 

# ext: extension by a new column

Computation 3: Assuming that we get an interest of 1 or 9 % and want to know how an amount of 100 Euro increases within a period of 10 years.

  [YEAR! 2016 .. 2026]
rec AMOUNT1:= first 100.
              next  AMOUNT1 pred *1.01 at YEAR
rec AMOUNT9:= first 100.
              next  AMOUNT9 pred *1.09 at AMOUNT1
rnd 2
# generates 11 numbers
# rec recursive extension

# rounds two digits after point