3. Indoctrination
Reduction in fear
Super awesome MongoDB non-relational database tips
An introduction on how to use the MongoDB C# Driver
Super awesome F# functional programming tips
How to integrate F# into your apps today
Looks at some functional techniques
BONUS: (I hope) some inspiration
4. 1. Analyze transactional data
2. Create models for setting prices
3. Work with sales team to raise prices
4. Measure results
6. • Mongo
– Unstructured data
– Flexible query language…using JavaScript!
– Feels…”light”
• F#
– Reasoning
• Less code
• No side effects
– Productivity
• fsi
• Focus on what, not where
7. • Data Access
– Mostly read-only
– Data processing heavy
– Non-standard formats from client to client
• Data Processing
– Calculate metrics on different slices of data
– Different formulas for various metrics
8. View (razor)
Controller (C#)
Model
Data Processing (F#)
(C#)
Data Access (F#)
MongoDB
12. static member Initialize() =
BsonClassMap.RegisterClassMap<Customer>(fun cm ->
cm.AutoMap()
cm.SetIdMember(cm.GetMemberMap("Number"))
) |> ignore
BsonClassMap.RegisterClassMap<Product>(fun cm ->
cm.AutoMap()
cm.SetIdMember(cm.GetMemberMap("SKU"))
) |> ignore
13. private static void ImportFromFile<T>(
string filename, Dictionary<string, int> fieldMappings)
where T: CoreObject {
var datafile = DataFile.FindOneById(filename);
var record = datafile.ReadLine();
while (record != null) {
var o = Activator.CreateInstance<T>();
o.Load(record, fieldMappings);
o.Save();
record = datafile.ReadLine();
}
}
15. • Current Situation
– Hard to find
– Hard to test
– Calculations are often performed “on top of”
other calculations
– Technical team needs to explain how formulas
work
16. let GetCollection<'T>() =
(new MongoRepository())
.GetDatabase()
.GetCollection<'T> typeof<'T>.Name
let Invoices = GetCollection<Invoice>
let GetInvoices (fromDate:DateTime) (toDate:DateTime) includeFields =
let query = Query
.GTE("Date", BsonDateTime.Create(fromDate))
.LTE(BsonDateTime.Create(toDate))
let fields = Fields.Exclude("_id").Include(includeFields)
Invoices().Find(query).SetFields(fields) :> seq<Invoice>
21. type Entity =
| Customer
| Product
let IndexEntity t attribute fromDate toDate indexOp =
let f =
match t with
| Customer -> IndexCustomers
| Product -> IndexProducts
f attribute fromDate toDate indexOp
22. OPERATIONAL DEVELOPMENT USER PERCEIVED
From days to minutes Reasoning about code “OK”
Closer to the data
Principles: 1) software is a means to an end; 2) the customer is the architect
Principles: 1) software is a means to an end; 2) the customer is the architect
INVESTIGATION of a solutionNarrow: focused on particular objectivesDrives deep: feasibility and “how it works”
Not unique…
SOLUTION EXPLORER- Models, Lib, Web- Show References- Order of files in F# project
Schema: wastexform: ripe for error, low bus numberload: complex, business rules data driven during load, can only be changed by reloading, “further from the data”Show C# code – fields we need versus “things that are interesting”How much effort did we just eliminate?
So What? Can do this with RDBMSMapping to database tables and columns vs. mapping to properties of an object
Field names: Parent, Salesman, Industry
Map-ReduceSELECT … GROUP BY!!!!Within a single toolUnit testing