SlideShare a Scribd company logo
1 of 25
Super Spike

Yep. It’s Super
Who am I?

            Who I am?
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
1. Analyze transactional data


                  2. Create models for setting prices


3. Work with sales team to raise prices


                         4. Measure results
Narrow




         Deep
• Mongo
  – Unstructured data
  – Flexible query language…using JavaScript!
  – Feels…”light”
• F#
  – Reasoning
       • Less code
       • No side effects
  – Productivity
       • fsi
       • Focus on what, not where
• 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
View (razor)


            Controller (C#)


Model
         Data Processing (F#)
 (C#)


           Data Access (F#)




         MongoDB
• Current Situation
  – Unknown schema
  – Complex transformation scripts
  – Complex loading scripts
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
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();
    }
}
{
    "_id": "1234567",
    "_t": "Customer",
    "Attributes": {
              "Parent": "Mike's Chocolates",
              "Salesman": "Willy Wonka",
              "Industry": "Candy"
    },
    "Name": "Choc a lot"
}

                            • Invoice
                                • Date
                                • Quantity
                                • Amount
                                • Customer
                                • Product
• 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
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>
static member GetRevenueByYear (fromDate:DateTime) (toDate:DateTime) =
   GetInvoices fromDate toDate [|"Date"; "Amount"|]
     |> Seq.groupBy (fun i -> i.Date.Year)
     |> Seq.map (fun (year, invoices) -> (year, (sumRevenue invoices)))
     |> Seq.sortBy (fun (year, _) -> year)




   let sumRevenue (invoices:seq<Invoice>) =
     invoices |> Seq.sumBy (fun i -> i.Amount)
let IndexByCustomer fromDate toDate operation attribute =
    Index “Customer”
        (fun i -> i.Customer.Attributes.[attribute])
       fromDate toDate
       operation

let IndexByProduct fromDate toDate operation attribute =
    Index “Product”
       (fun i -> i.Product.Attributes.[attribute])
       fromDate toDate
       operation



  let Index type groupF fromDate toDate indexF

  string -> (Invoice -> string) -> DateTime -> DateTime -> (seq<Invoice> -> float) ->
     seq<string * float * float>
string -> (Invoice -> string) -> DateTime -> DateTime -> (seq<Invoice> -> float) ->
   seq<string * float * float>

let IndexCustomers attribute =
  Index "Customer" (fun (i:Invoice) -> i.Customer.Attributes.[attribute])

let IndexProducts attribute =
  Index "Product" (fun (i:Invoice) -> i.Product.Attributes.[attribute])


string -> (DateTime -> DateTime -> (seq<Invoice> -> float) ->
  seq<string * float * float>)



let IndexByCustomer fromDate toDate operation attribute =
    IndexCustomers attribute fromDate toDate operation

let IndexByProduct fromDate toDate operation attribute =
    IndexProducts attribute fromDate toDate operation
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
OPERATIONAL            DEVELOPMENT            USER PERCEIVED
From days to minutes   Reasoning about code   “OK”
                       Closer to the data
mongodb.org

https://github.com/mongodb/mongo-csharp-driver




http://www.tryfsharp.org

FsUnit (via NuGet)




http://www.jqplot.com/
www: michaelfalanga.com

E-mail: me@michaelfalanga.com

Twitter: @mfalanga

More Related Content

Viewers also liked

نشاط هرمي
نشاط هرمينشاط هرمي
نشاط هرمي
guest9b857e
 
第72回 レッドブル翼をさずける② 完結編 単なるスポーツマーケティングではない
第72回 レッドブル翼をさずける② 完結編 単なるスポーツマーケティングではない第72回 レッドブル翼をさずける② 完結編 単なるスポーツマーケティングではない
第72回 レッドブル翼をさずける② 完結編 単なるスポーツマーケティングではない
Mitsuhiro Shimada
 
Move the groves_into_jazz_danc
Move the groves_into_jazz_dancMove the groves_into_jazz_danc
Move the groves_into_jazz_danc
samantha25
 
Reasonable Code With Fsharp
Reasonable Code With FsharpReasonable Code With Fsharp
Reasonable Code With Fsharp
Michael Falanga
 
نشاط هرمي
نشاط هرمينشاط هرمي
نشاط هرمي
guest9b857e
 
Yellowstone national park
Yellowstone national parkYellowstone national park
Yellowstone national park
samantha25
 
نشاط هرمي
نشاط هرمينشاط هرمي
نشاط هرمي
guest9b857e
 
第61回 ブルーオーシャン戦略② イノベーションのジレンマ 
第61回  ブルーオーシャン戦略② イノベーションのジレンマ 第61回  ブルーオーシャン戦略② イノベーションのジレンマ 
第61回 ブルーオーシャン戦略② イノベーションのジレンマ 
Mitsuhiro Shimada
 

Viewers also liked (19)

نشاط هرمي
نشاط هرمينشاط هرمي
نشاط هرمي
 
第78回 ネスレジャパン 稼ぐ仕組み 高岡浩三
第78回 ネスレジャパン 稼ぐ仕組み 高岡浩三第78回 ネスレジャパン 稼ぐ仕組み 高岡浩三
第78回 ネスレジャパン 稼ぐ仕組み 高岡浩三
 
第75回 スポーツマーケティング③スポーツマーケティングの構造&amp;テレビとスポーツ
第75回 スポーツマーケティング③スポーツマーケティングの構造&amp;テレビとスポーツ第75回 スポーツマーケティング③スポーツマーケティングの構造&amp;テレビとスポーツ
第75回 スポーツマーケティング③スポーツマーケティングの構造&amp;テレビとスポーツ
 
Don't Do Agile, Be Agile
Don't Do Agile, Be AgileDon't Do Agile, Be Agile
Don't Do Agile, Be Agile
 
T
TT
T
 
PLM Leveraging 3D Imaging
PLM Leveraging 3D ImagingPLM Leveraging 3D Imaging
PLM Leveraging 3D Imaging
 
Jocsflorals
JocsfloralsJocsflorals
Jocsflorals
 
Book1
Book1Book1
Book1
 
第72回 レッドブル翼をさずける② 完結編 単なるスポーツマーケティングではない
第72回 レッドブル翼をさずける② 完結編 単なるスポーツマーケティングではない第72回 レッドブル翼をさずける② 完結編 単なるスポーツマーケティングではない
第72回 レッドブル翼をさずける② 完結編 単なるスポーツマーケティングではない
 
Software as a Service
Software as a ServiceSoftware as a Service
Software as a Service
 
Move the groves_into_jazz_danc
Move the groves_into_jazz_dancMove the groves_into_jazz_danc
Move the groves_into_jazz_danc
 
Reasonable Code With Fsharp
Reasonable Code With FsharpReasonable Code With Fsharp
Reasonable Code With Fsharp
 
نشاط هرمي
نشاط هرمينشاط هرمي
نشاط هرمي
 
第62回 イノベーションのジレンマ②「市場調査やアンケート調査 」vs「行動観察」
第62回 イノベーションのジレンマ②「市場調査やアンケート調査 」vs「行動観察」第62回 イノベーションのジレンマ②「市場調査やアンケート調査 」vs「行動観察」
第62回 イノベーションのジレンマ②「市場調査やアンケート調査 」vs「行動観察」
 
Yellowstone national park
Yellowstone national parkYellowstone national park
Yellowstone national park
 
نشاط هرمي
نشاط هرمينشاط هرمي
نشاط هرمي
 
Mar argentino (1)
Mar argentino (1)Mar argentino (1)
Mar argentino (1)
 
第61回 ブルーオーシャン戦略② イノベーションのジレンマ 
第61回  ブルーオーシャン戦略② イノベーションのジレンマ 第61回  ブルーオーシャン戦略② イノベーションのジレンマ 
第61回 ブルーオーシャン戦略② イノベーションのジレンマ 
 
Destilación
DestilaciónDestilación
Destilación
 

Similar to Super spike

Patterns of Enterprise Application Architecture (by example)
Patterns of Enterprise Application Architecture (by example)Patterns of Enterprise Application Architecture (by example)
Patterns of Enterprise Application Architecture (by example)
Paulo Gandra de Sousa
 
SH 1 - SES 8 - Stitch_Overview_TLV.pptx
SH 1 - SES 8 - Stitch_Overview_TLV.pptxSH 1 - SES 8 - Stitch_Overview_TLV.pptx
SH 1 - SES 8 - Stitch_Overview_TLV.pptx
MongoDB
 
Kevin Bengtson Portfolio
Kevin Bengtson PortfolioKevin Bengtson Portfolio
Kevin Bengtson Portfolio
Kbengt521
 
Build a game with javascript (april 2017)
Build a game with javascript (april 2017)Build a game with javascript (april 2017)
Build a game with javascript (april 2017)
Thinkful
 
on SQL Managment studio(For the following exercise, use the Week 5.pdf
on SQL Managment studio(For the following exercise, use the Week 5.pdfon SQL Managment studio(For the following exercise, use the Week 5.pdf
on SQL Managment studio(For the following exercise, use the Week 5.pdf
formaxekochi
 

Similar to Super spike (20)

PoEAA by Example
PoEAA by ExamplePoEAA by Example
PoEAA by Example
 
Patterns of Enterprise Application Architecture (by example)
Patterns of Enterprise Application Architecture (by example)Patterns of Enterprise Application Architecture (by example)
Patterns of Enterprise Application Architecture (by example)
 
SH 1 - SES 8 - Stitch_Overview_TLV.pptx
SH 1 - SES 8 - Stitch_Overview_TLV.pptxSH 1 - SES 8 - Stitch_Overview_TLV.pptx
SH 1 - SES 8 - Stitch_Overview_TLV.pptx
 
Java/Scala Lab: Борис Трофимов - Обжигающая Big Data.
Java/Scala Lab: Борис Трофимов - Обжигающая Big Data.Java/Scala Lab: Борис Трофимов - Обжигающая Big Data.
Java/Scala Lab: Борис Трофимов - Обжигающая Big Data.
 
Simplify Feature Engineering in Your Data Warehouse
Simplify Feature Engineering in Your Data WarehouseSimplify Feature Engineering in Your Data Warehouse
Simplify Feature Engineering in Your Data Warehouse
 
[WSO2Con Asia 2018] Patterns for Building Streaming Apps
[WSO2Con Asia 2018] Patterns for Building Streaming Apps[WSO2Con Asia 2018] Patterns for Building Streaming Apps
[WSO2Con Asia 2018] Patterns for Building Streaming Apps
 
Kevin Bengtson Portfolio
Kevin Bengtson PortfolioKevin Bengtson Portfolio
Kevin Bengtson Portfolio
 
Geek Sync | Rewriting Bad SQL Code 101
Geek Sync | Rewriting Bad SQL Code 101Geek Sync | Rewriting Bad SQL Code 101
Geek Sync | Rewriting Bad SQL Code 101
 
Introduction to MongoDB at IGDTUW
Introduction to MongoDB at IGDTUWIntroduction to MongoDB at IGDTUW
Introduction to MongoDB at IGDTUW
 
Business Dashboards using Bonobo ETL, Grafana and Apache Airflow
Business Dashboards using Bonobo ETL, Grafana and Apache AirflowBusiness Dashboards using Bonobo ETL, Grafana and Apache Airflow
Business Dashboards using Bonobo ETL, Grafana and Apache Airflow
 
DataSaturday #1 - PBI Modeling At Warp Speed With Tabular Editor Advanced Scr...
DataSaturday #1 - PBI Modeling At Warp Speed With Tabular Editor Advanced Scr...DataSaturday #1 - PBI Modeling At Warp Speed With Tabular Editor Advanced Scr...
DataSaturday #1 - PBI Modeling At Warp Speed With Tabular Editor Advanced Scr...
 
MongoDB Stich Overview
MongoDB Stich OverviewMongoDB Stich Overview
MongoDB Stich Overview
 
Joining the Club: Using Spark to Accelerate Big Data at Dollar Shave Club
Joining the Club: Using Spark to Accelerate Big Data at Dollar Shave ClubJoining the Club: Using Spark to Accelerate Big Data at Dollar Shave Club
Joining the Club: Using Spark to Accelerate Big Data at Dollar Shave Club
 
Build a game with javascript (april 2017)
Build a game with javascript (april 2017)Build a game with javascript (april 2017)
Build a game with javascript (april 2017)
 
Adopting F# at SBTech
Adopting F# at SBTechAdopting F# at SBTech
Adopting F# at SBTech
 
Jquery fundamentals
Jquery fundamentalsJquery fundamentals
Jquery fundamentals
 
INTEGRATE 2022 - Data Mapping in the Microsoft Cloud
INTEGRATE 2022 - Data Mapping in the Microsoft CloudINTEGRATE 2022 - Data Mapping in the Microsoft Cloud
INTEGRATE 2022 - Data Mapping in the Microsoft Cloud
 
MongoDB .local Chicago 2019: Practical Data Modeling for MongoDB: Tutorial
MongoDB .local Chicago 2019: Practical Data Modeling for MongoDB: TutorialMongoDB .local Chicago 2019: Practical Data Modeling for MongoDB: Tutorial
MongoDB .local Chicago 2019: Practical Data Modeling for MongoDB: Tutorial
 
Harness SharePoint and jQuery to Make Dynamic Displays and Applications
 Harness SharePoint and jQuery to Make Dynamic Displays and Applications Harness SharePoint and jQuery to Make Dynamic Displays and Applications
Harness SharePoint and jQuery to Make Dynamic Displays and Applications
 
on SQL Managment studio(For the following exercise, use the Week 5.pdf
on SQL Managment studio(For the following exercise, use the Week 5.pdfon SQL Managment studio(For the following exercise, use the Week 5.pdf
on SQL Managment studio(For the following exercise, use the Week 5.pdf
 

Recently uploaded

Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 

Recently uploaded (20)

Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 

Super spike

  • 2. Who am I? Who I am?
  • 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
  • 5. Narrow Deep
  • 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
  • 9. • Current Situation – Unknown schema – Complex transformation scripts – Complex loading scripts
  • 10.
  • 11.
  • 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(); } }
  • 14. { "_id": "1234567", "_t": "Customer", "Attributes": { "Parent": "Mike's Chocolates", "Salesman": "Willy Wonka", "Industry": "Candy" }, "Name": "Choc a lot" } • Invoice • Date • Quantity • Amount • Customer • Product
  • 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>
  • 17. static member GetRevenueByYear (fromDate:DateTime) (toDate:DateTime) = GetInvoices fromDate toDate [|"Date"; "Amount"|] |> Seq.groupBy (fun i -> i.Date.Year) |> Seq.map (fun (year, invoices) -> (year, (sumRevenue invoices))) |> Seq.sortBy (fun (year, _) -> year) let sumRevenue (invoices:seq<Invoice>) = invoices |> Seq.sumBy (fun i -> i.Amount)
  • 18.
  • 19. let IndexByCustomer fromDate toDate operation attribute = Index “Customer” (fun i -> i.Customer.Attributes.[attribute]) fromDate toDate operation let IndexByProduct fromDate toDate operation attribute = Index “Product” (fun i -> i.Product.Attributes.[attribute]) fromDate toDate operation let Index type groupF fromDate toDate indexF string -> (Invoice -> string) -> DateTime -> DateTime -> (seq<Invoice> -> float) -> seq<string * float * float>
  • 20. string -> (Invoice -> string) -> DateTime -> DateTime -> (seq<Invoice> -> float) -> seq<string * float * float> let IndexCustomers attribute = Index "Customer" (fun (i:Invoice) -> i.Customer.Attributes.[attribute]) let IndexProducts attribute = Index "Product" (fun (i:Invoice) -> i.Product.Attributes.[attribute]) string -> (DateTime -> DateTime -> (seq<Invoice> -> float) -> seq<string * float * float>) let IndexByCustomer fromDate toDate operation attribute = IndexCustomers attribute fromDate toDate operation let IndexByProduct fromDate toDate operation attribute = IndexProducts attribute fromDate toDate operation
  • 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
  • 23.

Editor's Notes

  1. Principles: 1) software is a means to an end; 2) the customer is the architect
  2. Principles: 1) software is a means to an end; 2) the customer is the architect
  3. INVESTIGATION of a solutionNarrow: focused on particular objectivesDrives deep: feasibility and “how it works”
  4. Not unique…
  5. SOLUTION EXPLORER- Models, Lib, Web- Show References- Order of files in F# project
  6. 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?
  7. So What? Can do this with RDBMSMapping to database tables and columns vs. mapping to properties of an object
  8. Field names: Parent, Salesman, Industry
  9. Map-ReduceSELECT … GROUP BY!!!!Within a single toolUnit testing
  10. So many ways to compose functions. Make DSLs