This work was supported by the 2008–11 Donald E. Town Faculty Fellowship from DePauw University.
What is the difference between a HAVING
and a WHERE
condition when there is no GROUP BY
?
Generalized for
loop, based on set builder notation
val mentorPairs = for {
mentor <- students
other <- students
if mentor.year < other.year &&
mentor.major == other.major
} yield (mentor, other)
This is equivalent to
val mentors = students.flatMap(mentor =>
students.withFilter(other =>
mentor.year < other.year &&
mentor.major == other.major
).map(other =>
(mentor, other)
)
)
var mentors =
from mentor in students
from other in students
where mentor.year < other.year
&& mentor.major == other.major
select new {a = mentor, b = other};
SELECT mentor.ID as a, other.ID as b
FROM Student mentor, Student other
WHERE mentor.Year < other.Year
AND mentor.Major = other.Major;
List mentors = new ArrayList();
Statement statement = connection.createStatement();
String query =
"SELECT mentor.ID as a, other.ID as b " +
"FROM Student mentor, Student other " +
"WHERE mentor.Year < other.Year " +
" AND mentor.Major = other.Major;";
ResultSet results = statement.executeQuery(query);
while (results.next()) {
String mentorID = results.getString("a");
String otherID = results.getString("b");
mentors.add(new MIDPair(mentorID, otherID));
}
results.close();
@Entity
@Table(name="Student")
public class Student {
@Id @Column(name="ID")
private String id; // Primary key
@Column(name="Year")
private int year;
@ManyToOne @JoinColumn(name="Major")
private Department major; // Foreign key
// usual constructors, accessors, etc. go here
}
List mentors = new ArrayList();
String queryString =
"select mentor, other " +
"from Student mentor, Student other " +
"where mentor.year < other.year " +
" and mentor.major = other.major";
Query query = entityMgr.createQuery(queryString);
for (Object result : query.getResultList()) {
Object[] pair = (Object[]) result;
Student mentor = (Student) pair[0];
Student other = (Student) pair[1];
mentors.add(new MPair(mentor, other));
}
var context = ...;
var query =
from mentor in context.students
from other in context.students
where mentor.year < other.year
&& mentor.major == other.major
select new {a = mentor, b = other};
var mentors = query.ToList();
class Fork { val inUse = Ref(false) }
def meal(left: Fork, right: Fork) {
// thinking
atomic { implicit txn =>
if (left.inUse() || right.inUse())
retry // forks are not both ready, wait
left.inUse() = true
right.inUse() = true
}
// eating
atomic { implicit txn =>
left.inUse() = false
right.inUse() = false
}
}
Example from ScalaSTM library documentation
JavaScript Object Notation (JSON)
{
"ID": "12-34567",
"Name": "Ann O'Nemus",
"Year": 2015,
"Major": "Computer Science",
"Home Address": {
"Street": "123 Main",
"City": "Springfield",
"State": "AK",
"ZIP": 98765
},
"Phones": [
{"Type": "Home", "Number": "555-555-1234"},
{"Type": "Cell", "Number": "555-555-5678"}
]
}
Example in MongoDB: count number of students per major/year
var map = function() {
emit({"Major": this.Major,
"Year": this.Year}, 1)
}
var reduce = function(key, values) {
var total = 0;
for (index in values) total += values[index];
return total;
}
db.runCommand({
"mapreduce": "students", // source collection
"map": map,
"reduce": reduce,
"out": "graduates" // output collection
})
/